MATLAB中关于FFT的问题

2025-04-05 19:29:04
推荐回答(1个)
回答1:

现成的FFT程序网上可以下到很多,但如何定义相似度需要考虑一下。可以考虑用相对变化率的形式(相对变化率=(数值1-数值2)/数值1 或者 相对变化率=(数值1-数值2)/数值2 )。


有一种情况跟你的需求很像:设计滤波器后说明滤波效果。这种情况,需要比较变化前后的信号进行幅频特性、相频特性曲线,以此说明滤波效果。在这一过程中就需要对两个信号分别进行FFT变换,以求得幅频曲线和相频曲线。


具体过程如下:

step1:将横坐标定义为t(matlab赋值语句t=[*,*,*];),将纵坐标定义为y(matlab赋值语句y=[*,*,*];),采样频率就是临近两个横坐标差值的倒数(一般横坐标都应为时间);

step2:新建一个m文件(快捷键为ctrl+N);

step3:将如下程序复制到m文件中

    t=[*,*,*];%填入横轴数据

    y=[*,*,*];%填入纵轴数据


    N = size(t,2);%行向量时,列向量是为N = size(t,1);

    N = 2^(nextpow2(N)-1); 

    Y = fft(y,N);

    

    mag_Y = abs(Y)/N*2;%各个频率点处的幅值,这个就是fft变换后的数据

    f = fs/2*linspace(0,1,N/2+1);%对应的频率值

    plot(f,mag_Y(1:N/2+1))%显示变换后的曲线

step4:亲测实例

    t = 1:0.001:10;

    y= 2*sin(2*pi*100*t);%频率为100Hz

    %=================以下同step3中代码==============

    N = size(t,2);%行向量时,列向量是为N = size(t,1);

    N = 2^(nextpow2(N)-1); 

    Y = fft(y,N);

    

    mag_Y = abs(Y)/N*2;%各个频率点处的幅值,这个就是fft变换后的数据

    f = fs/2*linspace(0,1,N/2+1);%对应的频率值

    plot(f,mag_Y(1:N/2+1))%显示变换后的曲线    

    %=================以上同step3中代码==============

    结果:

由于matlab自带FFT函数有些小瑕疵,所以在100Hz处幅值虽然接近2,但还是有些偏差的,对于偏差的修正网上也有相应的方法,如果需要在留言。