该fft
函数采用单位时间步长。为了校正非单位时间步长,您需要根据奈奎斯特率定义频率分量。以下代码fft
用正确的频率轴绘制了 的幅度。
clc;
clear all;
close all;
x=1:0.001:10;
% ^ this is your sampling time step
f1=sin(2*pi*10*x);
f2=sin(2*pi*15*x);
f3=sin(2*pi*30*x);
% bounds of fourier transform based on sampling rate
Fs = 1/0.001;
ff = linspace(-Fs/2,Fs/2,numel(x));
F1 = fftshift(fft(f1)/numel(x));
F2 = fftshift(fft(f2)/numel(x));
F3 = fftshift(fft(f3)/numel(x));
figure();
plot(ff,abs(F1),'-r'); hold on;
plot(ff,abs(F2),'-b');
plot(ff,abs(F3),'-k');
编辑:在评论中回答 OPs 问题。
以标准化频率单位说话(假设采样率为 1)。该fft
函数返回从0
到2*pi
弧度的频率响应,但由于某些信号处理特性以及在执行 FFT 时解释离散信号的方式,信号实际上是周期性的,因此pi
to2*pi
部分与-pi
to部分相同0
。为了在中心显示 DC 分量(0 频率)的绘图,我们使用fftshift
它在返回的数据上执行等于信号长度 1/2 的循环移位fft
。在您采取之前,请ifft
确保您使用ifftshift
将其放回正确的位置。
编辑 2:归一化项 ( /numel(x)
) 是使用离散傅立叶变换估计连续时间傅立叶变换所必需的。我不记得我脑海中的精确数学原因,但MATLAB 文档中的示例也暗示了这种标准化的必要性。
编辑 3:我拥有的原始链接已关闭。我可能会回来添加更详细的答案,但与此同时,我绝对建议任何有兴趣了解 FS、FT、DTFT 和 DFT 基础知识之间关系的人观看 Oppenheim 教授的搞笑古老但内容丰富且直截了当的讲座在麻省理工学院开放课件上。