zoukankan      html  css  js  c++  java
  • [引用]MATLAB中的fft后为何要用fftshift

    原文地址:MATLAB中的fft后为何要用fftshift

    fft是一维傅里叶变换,即将时域信号转换为频域。

    fftshift是针对频域的,将FFT的DC分量移到频谱中心,重新排列fft,fft1和……ftn的输出结果。

    fftshift就是对换数据的左右两边比如
    x=[1 2 3 4]
    fftshift(x) ->[3 4 1 2]

    IFFTSHIFT Inverse FFT shift.(就是fftshift的逆)

    x=[1     2     3     4     5];

    y=fftshift(x)

    y =

         4     5     1     2     3

    ifftshift(y)

    ans =

         1     2     3     4     5

    在OFDM系统中,将DC分量0移到频谱中心

    x = [0 0 1 1 1 1 1 1 0 0];
    fftshift(x)

    ans =

    1 1 1 0 0 0 0 1 1 1

    直接用fft得出的数据与频率不是对应的,fftshift可以纠正过来

    示例:

    clf;

    fs=100;N=256;   %采样频率和数据点数
    n=0:N-1;t=n/fs;   %时间序列
    x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号

    y1=fft(x,N);    %对信号进行快速Fourier变换
    y2=fftshift(y1);

    mag1=abs(y1);     %求得Fourier变换后的振幅
    mag2=abs(y2);    

    f1=n*fs/N;    %频率序列
    f2=n*fs/N-fs/2;

    subplot(3,1,1),plot(f1,mag1,'r');   %绘出随频率变化的振幅
    xlabel('频率/Hz');
    ylabel('振幅');title('图1:usual FFT','color','r');grid on;

    subplot(3,1,2),plot(f2,mag1,'b');   %绘出随频率变化的振幅
    xlabel('频率/Hz');
    ylabel('振幅');title('图2:FFT without fftshift','color','b');grid on;

    subplot(3,1,3),plot(f2,mag2,'c');   %绘出随频率变化的振幅
    xlabel('频率/Hz');
    ylabel('振幅');title('图3:FFT after fftshift','color','c');grid on;

    结论:

    1)如果期望绘制的幅频图的频率范围为0~fs,则无需运行fftshift变换,如图1。

    2)如果期望绘制的幅频图的频率范围为-fs/2~fs/2,则需要运行fftshift变换,如图3;如果不变换,图示的响应频点会发生变换,如图2。

  • 相关阅读:
    青蛙学Linux—MySQL常用命令(二)
    青蛙学Linux—MySQL常用命令(一)
    青蛙学Linux—MySQL安装和初始化
    青蛙学Linux—MySQL
    青蛙学Linux—Apache提供HTTPS服务
    青蛙学Linux—Apache配置PHP支持
    青蛙学Linux—Apache+Tomcat实现动静分离以及负载均衡
    青蛙学Linux—Apache负载均衡的实现
    青蛙学Linux—Apache反向代理的实现
    青蛙学Linux—Apache的MPM模式和httpd-mpm.conf
  • 原文地址:https://www.cnblogs.com/achangchang/p/10705345.html
Copyright © 2011-2022 走看看