这是我上一门课程的问题,只想说明一下。
我想做的是对一个方波进行采样,进行傅立叶变换(fft)并绘制图形答案。这就是我实现这一目标的方式:
Fs = 100;
Ts = 1/Fs;
N = 8192;
Tmax = (N - 1)*Ts;
t = 0:Ts:Tmax;
x = square(t);
X = fft(x,N);
plot(t, abs(X))
返回的是一个看起来像这样的图
这看起来几乎是经过检查的,但是由于我不知道对方波会有什么期望,因此我也尝试使用$ \ sin(2 * t)$波来实现。如果对此进行傅立叶变换,则应该得到2个尖峰,每个尖峰分别为2和-2(右侧)。但是我得到的是这样的东西
(注意!我已经放大了图表的左侧以显示尖峰不在2处)。您可以看到,尖峰不在应有的位置。然后我可以得出结论,大概是1图并不符合其应有的水平。
我的x轴表示形式有问题吗?如果是这样,如何将x轴转换为频率平面?
答案 0 :(得分:1)
FFT产生的频率范围是从0到采样频率。具体来说,FFT的水平轴对应于频率0
,fs/N
,2*fs/N
,...,(N-1)*fs/N
,其中fs
是采样频率, N
是FFT大小。
因此,您应将绘图中的水平轴修改为以下内容,其中N
为numel(t)
,而fs
的计算方式为1/(t(2)-t(1))
:
freq_axis = (0:numel(t)-1)/numel(t)/(t(2)-t(1));
plot(freq_axis, abs(X))
您可能还希望应用fftshift
来观察从-fs/2
到fs/2
的频率,而不是从0
到fs
的频率。在这种情况下:
freq_axis = (-numel(t)/2:numel(t)/2-1)/numel(t)/(t(2)-t(1));
plot(freq_axis, fftshift(abs(X)))
作为检验,以您的示例x = sin(2*t)
为例,第二个图给出:
将您的sin(2*t)
与通用表达式sin(2*pi*f*t)
进行比较,可以看到该正弦曲线的频率f
为1/pi = 0.3183
,与数字一致。