Matlab没有绘制精确的傅立叶信号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab没有绘制精确的傅立叶信号相关的知识,希望对你有一定的参考价值。

我正在尝试使用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))的图像

This is the image for plot(x,fft(f1))

这是plot(2*pi*x,fft(f1))的图像

This is the image for plot(2*pi*x,fft(f1))

它没有显示在10的峰值。我甚至尝试使用abs(fft(f1))。没运气 :/

这不是在傅立叶域中绘制信号的正确方法吗?

答案

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');

enter image description here

编辑:在评论中回答OP问题。

以标准化频率单位表示(假设采样率为1)。 fft函数将0的频率响应返回到2*pi弧度,但由于某些信号处理属性以及执行FFT时解释离散信号的方式,信号实际上是周期性的,所以pi2*pi部分与-pi相同0部分。为了在中心显示DC分量(0频率)的图,我们使用fftshift,它的循环移位等于fft返回的数据信号长度的1/2。在你采取ifft之前,请确保使用ifftshift将其放回正确的位置。

编辑2:归一化项(/numel(x))是使用离散傅立叶变换估计连续时间傅里叶变换所必需的。我不记得我头顶的精确数学原因,但MATLAB documentation中的例子也暗示了这种正常化的必要性。

编辑3:我的原始链接已关闭。我可以回过头来补充一个更详细的答案,但同时我肯定会建议任何有兴趣了解FS,FT,DTFT和DFT基本面之间关系的人观看奥本海姆教授的欢快,但信息丰富且直截了当的lectures on MIT OpenCourseWare

以上是关于Matlab没有绘制精确的傅立叶信号的主要内容,如果未能解决你的问题,请参考以下文章

基于MATLAB的FFT傅立叶分析

MATLAB之图像与音频信号处理

Matlab信号处理基础

选带快速傅立叶变换ZOOM-FFT的matlab实现

全套完结数字信号处理----全套Matlab实验报告建议保存

利用快速傅立叶变换,在频域中实现脉冲压缩的matlab仿真程序