我正在使用MATLAB R2013。
fs=8000;
t=(1:512)'/fs; %'// <-- prevents string markdown
f=306.396;
original=sin(2*pi*f*t)+0.2*randn(length(t),1);
windowed=original.*hamming(length(t));
[mag1,phase1,freq1]=fftOneSide(original,fs);
错误:
未定义函数'fftOneSide'用于'double'类型的输入参数
答案 0 :(得分:1)
这个问题是在之前的SO问题中提出的,到目前为止显然没有回应: error in using fftoneside
使用输入信号,不使用汉明功能(我的计算机上没有信号工具箱),定义下面的功能后(我在底部注释了演示代码,第一行注释了if nargin <1
obv !!),我在Matlab2015a上运行它。它跑得很好!设置plotOpt=1
(使用三个参数调用,最终等于1)提供证据:
我唯一能想到的是,在源代码中它要求输入一个文件 - 我假设你没有。如果您注释掉nargin <1
部分以及最后的整个自我演示,请查看这是否无法正常工作。如果没有,我完全感到困惑!
我已经看了这个函数的源代码(下面),它也显示了正确的用法。正如您所看到的,他们正在从文件中读取信号和fs
值,而不是像在此处一样定义它们。我们无法看到他们选择的价值,这有点痛苦。
请注意,调用要求指定plotOpt
,但如果您没有指定,则开头的nargin
调用应该为您设置为0(对吗?)。我认为自2012年以来默认函数声明没有改变 - 但如果它们有,那么用三个参数调用函数将会解决这个问题。注意:如果不设置plotOpt = 1,则图表将不会继续。
http://read.pudn.com/downloads99/sourcecode/others/404673/audioProcessing/fftOneSide.m__.htm
function [magSpec, phaseSpec, freq, powerSpecInDb]=fftOneSide(signal, fs, plotOpt)
% fftOneSide: One-sided FFT for real signals
% Usage: [magSpec, phaseSpec, freq, powerSpecInDb]=fftOneSide(signal, fs)
%
% For example:
% [y, fs]=wavread('welcome.wav');
% frameSize=512;
% startIndex=2047;
% signal=y(startIndex:startIndex+frameSize+1);
% signal=signal.*hamming(length(signal));
% plotOpt=1;
% [magSpec, phaseSpec, freq, powerSpecInDb]=fftOneSide(signal, fs, plotOpt);
% Roger Jang, 20060411, 20070506
if nargin<1, selfdemo; return; end % MBio: comment out
if nargin<2, fs=1; end
if nargin<3, plotOpt=0; end
N = length(signal); % Signal length
freqStep = fs/N; % Frequency resolution
time = (0:N-1)/fs; % Time vector
z = fft(signal); % Spectrum
freq = freqStep*(0:N/2); % Frequency vector
z = z(1:length(freq)); % One side
z(2:end-1)=2*z(2:end-1); % Assuming N is even, symmetric data is multiplied by 2
magSpec=abs(z); % Magnitude spectrum
phaseSpec=unwrap(angle(z)); % Phase spectrum
powerSpecInDb=20*log(magSpec+realmin); % Power in db
if plotOpt
% ====== Plot time-domain signals
subplot(3,1,1);
plot(time, signal, '.-');
title(sprintf('Input signals (fs=%d)', fs));
xlabel('Time (seconds)'); ylabel('Amplitude'); axis tight
% ====== Plot spectral power
subplot(3,1,2);
plot(freq, powerSpecInDb, '.-'); grid on
title('Power spectrum');
xlabel('Frequency (Hz)'); ylabel('Power (db)'); axis tight
% ====== Plot phase
subplot(3,1,3);
plot(freq, phaseSpec, '.-'); grid on
title('Phase');
xlabel('Frequency (Hz)'); ylabel('Phase (Radian)'); axis tight
end
% ====== Self demo MBio: comment ALL this code out!
function selfdemo
[y, fs]=wavread('welcome.wav');
frameSize=512;
startIndex=2047;
signal=y(startIndex:startIndex+frameSize+1);
signal=signal.*hamming(length(signal));
[magSpec, phaseSpec, freq, powerSpecInDb]=feval(mfilename, signal, fs, 1);