功能没什么问题chirp
...
您只需要根据频率值绘制 db_fft,而不是矢量索引 =)。
plot(linspace(fo,f1,length(db_fft)), db_fft);
我还测试了使用我的其他 FFT 方法计算信号的 FFT,它们也指示了 0 到 400 Hz 之间的范围。
更新:
IMO,我发现不以 dB 或功率(周期图)绘制在视觉上更容易。这是一个很好的例子,也是我计算时域信号 FFT 的 goto 方法:mathworks.se/help/matlab/ref/fft.html
回复:
经过一番思考,我同意我上面的回答是不正确的,但不是因为你说的原因。频域中的 x 轴不应达到啁啾的实际长度(或一半,或 dubbel 或类似的东西)。频域中的 x 轴应该达到信号采样率 (Fs/2) 的一半,并且您有义务确保您以两倍于您希望/希望的最大频率的采样频率对信号进行采样解决。
换句话说,假设您的 FFT 与您的时域信号的长度相同/两倍/一半是不正确的,因为我们可以选择任意数量的频率区间来表示 FFT,最佳实践是长度 = N^2 ( 2) 的幂,用于快速计算。想一想,为什么在计算 FFT 时还需要知道时间值?你没有!您只需要采样频率(应设置为 Fs = 1000 btw,而不是 Fs = 0.001)。
我上面的回答是不正确的,应该是:
plot(linspace(0, Fs/2, length(db_fft)), db_fft)
而不是 Fs/2,你写的是 length(t)/(2*Tfinal)。它(几乎)与 Fs/2 的值相同,但它不是正确的方法 =)。
这是我的 goto FFT 方法(值不是以 dB 为单位)。
function [X,f] = myfft(x,Fs,norm)
% usage: [X, f] = myfft(x,Fs,norm);
% figure(); plot(f,X)
% norm: 'true' normalizes max(amplitude(fft))=1, default=false.
if nargin==2
norm=false;
end
L = length(x); NFFT = 2^nextpow2(L);
f = Fs/2*linspace(0,1,NFFT/2+1);
%f =0:(Fs/NFFT):Fs/2;
X = fft(x,NFFT)/L; X = 2*abs(X(1:NFFT/2+1));
if norm==true; X = X/max(abs(X)); end
end
这是 [Xfft, f] = myfft(X,Fs); 的结果图 情节(f,Xfft);请注意,根据 NyQuist 定理,返回频率 bin 向量具有 max(f) = Fs/2(无法解析任何高于 Fs/2 的频率)。