zoukankan      html  css  js  c++  java
  • Matlab计算的FFT与通过Origin计算的FFT

    实验的过程中,经常需要对所采集的数据进行频谱分析,软件的选择对计算速度影响挺大的。我在实验过程中,通常使用Origin7.5来进行快速傅里叶变换,因为方便快捷,计算之后,绘出来的图也容易编辑。但是当数据容量太大,达到100M大小,这时候使用Origin7.5进行快速傅里叶变换,运算速度非常慢,甚至运算不出来。

      对大容量的数据进行快速傅里叶变换,我使用Matlab,运算速度比Origin7.5快很多。但是使用Matlab进行FFT时,需要进行一些小的处理,才能使运算结果与使用Origin7.5进行FFT时得到的结果保持一致。

    (1)首先介绍运用Origin7.5进行FFT的基本操作,

         选中数据后,点击“分析”,下拉菜单中出现“快速傅里叶变换FFT”,点击进入,这个时候会弹出对话框。对话框中,“FFT”下面的“Forward”和“Backward”是正变换和逆变换。“Spectrum”选择“Amplitude”或者选择“Power”,一个是幅度谱,一个是功率谱。其中功率谱是幅度谱的平方。

    点击对话中“Settings”按钮,弹出对话框。

    其中第四行“Sampling”设置为采样间隔,就是采样率的倒数。第一行的“Sampling”可以不用设置,第二行的“Real”为需要进行傅里叶变换的离散数据,数据一般是实数,故没有虚部,第三行的“Imaginar”不用设置。

    “Window Method”一般选择“Rectangular”,

    各个窗函数的表示式为:

    上述对话框中“Output Options”下面的选项,第一行为是否对FFT之后的幅度进行归一化,这个是要选择归一化的。第二行,表示式单边带,还是双边带,我一般选择单边带。第三行和相位相关。

    上述对话框中“Exponential Phase Factor”表示FFT是选择e-jwt还是ejwt,通常FFT算法是前者。

    上述这是完之后,就可以得到FFT之后的结果。

    关于Origin进行FFT原理,可以参考网页:

    (2)其次介绍运用Matlab进行FFT的基本操作,

         在使用Matlab进行FFT时,首先要搞清楚FFT的原理。离散傅里叶变换,需要输入数据必需是2n,当输入的数据不是时,则补零,使其满足2n。因此,在使用Matlab进行FFT时,首先是知道离散数据的个数,然后对其补零,之后才是FFT运算。

         在Matlab导入数据之后,我通常的做法是使用函数length对数据求大小,比如得到N,然后求解log2(N),比如是21.22。然后使用fft(data,222),之所以是222,是因为数据个数补零之后,数据个数是222。fft(data,222)得到的result就是通常的结果,这是个复数。对result求模,即通过函数abs(result)实现,得到的是幅度,这个时候得到的幅度谱和使用Origin得到的没有归一化的幅度谱是一致。但是,通常我们使用Origin是得到归一化的幅度谱,因此这里得到abs(result)之后,进行归一化,即abs(result)*2/222,在频率点零值处,归一化应该为abs(result)/222,频率点的设置为(0: 222-1)*fs/222,其中fs是采样率。最后plot(f, abs(result)*2/222)就是最后的归一化的幅度,注意就是零值处的特殊处理。

        Origin作归一化处理的时候,并没有考虑零值和其他地方的不同,都是除以n/2

         使用Matlab得到FFT结果之后,就是导出数据,通常数据较大,使用一般的粘贴复制太慢或不行,我一般使用函数dlmwrite。导出的数据,再导入Origin画图,也比较方便。

    看后请点赞
  • 相关阅读:
    bash while until 循环用法
    微信小程序入门介绍
    jquery遍历
    jquery获取元素和DOM获取元素
    ul在div中水平居中效果
    一个文字在一个图片上水平居中,并且悬浮变大特效
    一个div在另一个div中垂直居中的方法
    layer插件的使用
    百度分享插件使用
    图标字体
  • 原文地址:https://www.cnblogs.com/hyb221512/p/10104473.html
Copyright © 2011-2022 走看看