H60880316 发表于 2010-1-5 11:54

利用MATLAB做快速傅里叶变换

看到很多人不会用MATLAB做FFT,特别利用MATALB的FFT函数编制一个程序如下:
%%本程序利用快速傅里叶变换FFT,求取时域信号的幅值频域分布;

clear;clc;               %清空变量空间

load data;      %输入信号:先将各种格式的信号数据导入,然后存为MAT格式;
t=data(:,1);               %对应时间点;
x=data(:,2);               %对应信号值的大小;

lenx=length(x);            %求取取样数和基波频率;
N=lenx-1;
tstart=t(1);tend=t(lenx);
T=tend-tstart;f0=1/T;
k=0:N/2-1;
fs=k*f0;

xk=fft(x,N);               %快速傅里叶变换;
mag_xk=abs(xk)/(N/2);      %除以N/2,以得到每个频率点的幅值;
mag_xk=mag_xk(1:N/2);      %因为结果是对称的,所以只取其中一半;

subplot(2,1,1);            %绘制输入信号图;
plot(t,x);
grid on;

subplot(2,1,2);            %绘制各频率点的幅值图;
stem(fs,mag_xk);
grid on;

H60880316 发表于 2010-1-5 11:55

信号和FFT图

careywu 发表于 2010-1-5 15:38

虽然不难,但还是赞下LZ的热心

zengxiaodong 发表于 2010-1-5 19:30

你没有讲到相位谱的问题,而恰恰在这方面容易出问题,例如相位解缠Unwrap,频率Shift等,下面这篇帖子里有一个实例,请楼主去诊断和指导一下。

https://bbs.simol.cn/thread-9237-1-1.html

H60880316 发表于 2010-1-5 21:12

增加的相位谱如下:

%%本程序利用快速傅里叶变换FFT,求取时域信号的幅值频域分布;

clear;clc;               %清空变量空间

load data1;      %输入信号:先将各种格式的信号数据导入,然后存为MAT格式;
t=data1(20:40,1)/1000;   %对应时间点;
x=data1(20:40,2);          %对应信号值的大小;

lenx=length(x);            %求取取样数和基波频率;
N=lenx-1;
tstart=t(1);tend=t(lenx);
T=tend-tstart;f0=1/T;
k=0:N/2-1;
fs=k*f0;

xk=fft(x,N);               %快速傅里叶变换;
mag_xk=abs(xk)/(N/2);      %除以N/2,以得到每个频率点的幅值;
mag_xk=mag_xk(1:N/2);      %因为结果是对称的,所以只取其中一半;
ang_xk=angle(xk)/(2*pi)*360;
ang_xk=ang_xk(1:N/2);

subplot(3,1,1);            %绘制输入信号图;
plot(t,x);
title('输入信号图');xlabel('时间以秒为单位');ylabel('信号以伏特为单位');
grid on;

subplot(3,1,2);            %绘制各频率点的幅值图;
stem(fs,mag_xk);
title('信号频谱图');xlabel('频率以赫兹为单位');ylabel('幅值以伏特为单位');
grid on;

subplot(3,1,3);            %绘制各频率点的角度图;
stem(fs,ang_xk);
title('信号频谱图');xlabel('频率以赫兹为单位');ylabel('以角度为单位');
grid on;

H60880316 发表于 2010-1-5 21:17

但是MAXWELL的相位谱和MATLAB有所不同。



zengxiaodong 发表于 2010-1-6 08:55

那你分析一下,这个文件中,2个波形内各次谐波的相位差。重点是4次谐波的相位差,或者5次谐波的相位差。谢谢!

huffs 发表于 2010-1-6 10:24

学习了,蛮复杂的

luckyboy 发表于 2017-10-3 16:40

不错不错,谢谢楼主分享
页: [1]
查看完整版本: 利用MATLAB做快速傅里叶变换