傅里叶变换的仿真,你真懂了吗

来源:互联网 发布:echarta导入json实例 编辑:程序博客网 时间:2024/05/09 19:44

1. 为什么fft变换后结果还要*2/N

答:首先除以N的原因是由于DFT和IDFT的定义不同决定的


查看DFT反变换的定义可以发现,与与正变换不同的是求和后要除以1/N,

它的物理意义可以表述为:

信号x(n)可以表示为N个复指数信号的线性组合,其中的每个X(k)都是谐波分量,则abs(X(k))/N就代表对应“谐波”分量的幅度

因此 FFT变换后的结果需要除以N,才代表复指数信号的幅值,也就是频谱中某一频率的幅值大小。


2. FFT变换后的结果要不要 *2?

答:这个要看你怎么分析,如果你考虑的是单边谱那你就需要 * 2


如果从时域上理解,可以由公式推导


其中

可以对两边去abs,则可以推导出

如果从频域的物理意义上理解:

因为通常 对于一个实际信号而言,是不存在负频率的,而FFT变换是认为信号存在负频率,认为信号是由一系列共轭复数构成的。

而能量是要保持守恒的,因此在负频率的能量叠加到正频率上,即需要变为2倍。


3.仿真参数中的含义

% Ts 表示间隔Ts时间采样,这个越小越接近连续信号,而实际上不可能真正的仿真连续信号。
% df 表示变化后频率分量的最小间隔,即频谱中相邻的点间隔频率是多大,你也可以叫它 频率分辨力

% 为什么df = fs/N-1呢?
% 因为采样频率 fs=1/Ts,表示的意义是连续信号用fs去采样,得到了
% 离散的信号,因此实际上的连续信号在这里并没有给出,因为MATLAB不可能做的真正的
% 连续信号,而且既然采样间隔是Ts,所以时域信号也就只给出间隔Ts的信号,这样可以
% 刚好满足仿真需求,当然你也可以把时域的信号变为更细,把时间间隔变得更小,

% 也就是说信号的个数是 采样频率的整数倍,确保能够正常才够采样。


4.fs的选取,根据采样定义,fs>2fmax

如果信号最高频率分量为10HZ,则采样频率一定要大于或等于20HZ,最好选大点。这样仿真效果明显

clear all;


    Ts=0.01;
    t=-1:Ts:1;
    %采样信号频率是fs=100;
    fs=1/Ts;
    %原信号频率是10;
    x=5*sin(2*pi*10*t);
    %N是总共的采样点数,N=101;
    N=length(x);
    fx=fft(x);
    %N个点有N-1个间隔;
    df=fs/(N-1);
    %让负频率也显示出来;
    n=-(N-1)/2:(N-1)/2;
    f=n*df;
    subplot(211);
    plot(t,x);
    grid;
    title('原始信号');
    xlabel('时间(t)');
    ylabel('幅度');
    subplot(212);
    plot(f,abs(fftshift(fx))*2/N);
    grid;
    title('频谱');
    xlabel('频率(hz)');
    ylabel('频率分量');

% 此外MATLAB中FFT计算结果是一个N点的复数,且第n点表示的含义是
% 频率为 Fn = (n-1)*Fs/N 的复数值(cos 和 sin的分量)
% 它的模大小abs就是傅里叶的频谱幅度大小。

% 关于fftshift这个函数,它的作用是:
% shift zero-frequency component to center of spectrum.
% 因为FFT出来的结果是频率0~Fs分布的,如果想看双边频率谱,就需要将频率变为
% -Fs~0~FS。