Matlab 没有绘制精确的傅里叶信号
Matlab not plotting the exact fourier signal
我正在尝试使用 Matlab 在傅里叶域中绘制一个简单的信号。它没有绘制正确的信号。这是我的代码:
clc;
clear all;
close all;
x=1:0.001:10;
f1=sin(2*pi*10*x);
f2=sin(2*pi*15*x);
f3=sin(2*pi*30*x);
f=f1+f2+f3;
plot(2*pi*x,fft(f1));
figure
plot(x,fft(f1));
由于频率为 10,我预计峰值为 10。但它在其他某个点出现峰值
下面是两张剧情图片:
这是 plot(x,fft(f1))
的图片
这是 plot(2*pi*x,fft(f1))
的图片
即使尝试使用 abs(fft(f1)),它也没有显示 10.I 处的峰值。运气不好 :/
这不是在傅立叶域中绘制信号的正确方法吗?
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');
编辑:在评论中回答 OP 问题。
以归一化频率单位说话(假设采样率为 1)。 fft
函数 returns 从 0
到 2*pi
弧度的频率响应,但由于某些信号处理特性和执行 FFT 时离散信号的解释方式,信号实际上是周期性的,因此 pi
到 2*pi
部分与 -pi
到 0
部分相同。为了在中心显示直流分量(0 频率)的图,我们使用 fftshift
,它循环移位等于 fft
返回的数据上信号长度的 1/2。在使用 ifft
之前,请确保使用 ifftshift
将其放回正确的位置。
Edit2:归一化项(/numel(x)
)是使用离散傅里叶变换估计连续时间傅里叶变换所必需的。我不记得我头脑中的精确数学原因,但 MATLAB documentation 中的示例也暗示了这种规范化的必要性。
编辑 3:我原来的 link 已关闭。我可能会回来添加更详细的答案,但与此同时,我绝对建议任何有兴趣了解 FS、FT、DTFT 和 DFT 之间关系的人观看 Oppenheim 教授的滑稽古老,但内容丰富且直截了当 lectures on MIT OpenCourseWare.
我正在尝试使用 Matlab 在傅里叶域中绘制一个简单的信号。它没有绘制正确的信号。这是我的代码:
clc;
clear all;
close all;
x=1:0.001:10;
f1=sin(2*pi*10*x);
f2=sin(2*pi*15*x);
f3=sin(2*pi*30*x);
f=f1+f2+f3;
plot(2*pi*x,fft(f1));
figure
plot(x,fft(f1));
由于频率为 10,我预计峰值为 10。但它在其他某个点出现峰值
下面是两张剧情图片:
这是 plot(x,fft(f1))
这是 plot(2*pi*x,fft(f1))
即使尝试使用 abs(fft(f1)),它也没有显示 10.I 处的峰值。运气不好 :/
这不是在傅立叶域中绘制信号的正确方法吗?
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');
编辑:在评论中回答 OP 问题。
以归一化频率单位说话(假设采样率为 1)。 fft
函数 returns 从 0
到 2*pi
弧度的频率响应,但由于某些信号处理特性和执行 FFT 时离散信号的解释方式,信号实际上是周期性的,因此 pi
到 2*pi
部分与 -pi
到 0
部分相同。为了在中心显示直流分量(0 频率)的图,我们使用 fftshift
,它循环移位等于 fft
返回的数据上信号长度的 1/2。在使用 ifft
之前,请确保使用 ifftshift
将其放回正确的位置。
Edit2:归一化项(/numel(x)
)是使用离散傅里叶变换估计连续时间傅里叶变换所必需的。我不记得我头脑中的精确数学原因,但 MATLAB documentation 中的示例也暗示了这种规范化的必要性。
编辑 3:我原来的 link 已关闭。我可能会回来添加更详细的答案,但与此同时,我绝对建议任何有兴趣了解 FS、FT、DTFT 和 DFT 之间关系的人观看 Oppenheim 教授的滑稽古老,但内容丰富且直截了当 lectures on MIT OpenCourseWare.