http://blog.sina.com.cn/s/blog_68f3a4510100qvp1.html

注:转载请注明出处——by author.

我们知道Fourier分析是信号处理里很重要的技术,matlab提供了强大的信号处理能力,但是有一些细节部分需要我们注意。

记信号f(t)的起始时间为t_start, 终止时间为t_end, 采样周期为t_s, 可以计算信号的持续时间Duration为 t_end – t_start, 信号离散化造成的采样点数 N = Duration/t_s + 1;

根据Fourier分析的相关结论,我们知道时域的采样将会造成频域的周期化,该周期为采样频率f_s(著名的香农采样定理基于此).

于是, 经过matlab的fft函数处理后,得到数据的横坐标为0:f_s/(N-1):f_s。相关代码如下所示:

%matlab fft 测试代码

t_s = 0.01;
t_start = 0.5; t_end = 5;
t = t_start:t_s:t_end;
y = 0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
y_f = fft(y);

subplot(3,1,1);
plot(t,y); title('original signal');

Duration = t_end - t_start;
Sampling_points = Duration/t_s + 1;

f_s = 1/t_s;
f_x = 0:f_s/(Sampling_points-1):f_s;

subplot(3,1,2);
plot(f_x,abs(y_f)); title('fft transform');

subplot(3,1,3);
plot(f_x-f_s/2,abs(fftshift(y_f))); title('shift fft transform');

也就是说,如果我们不使用fftshift,其变换后的横坐标为0:f_s/(N-1):f_s, 如果使用fftshift命令,0频率分量将会移到坐标中心,这也正是matlab中帮助中心给出的意思:对fft的坐标进行了处理。实际上由于频谱的周期性,我们这样做是合理的,可以接受的。

请读者特别要注意横坐标的差别。另外,根据函数的特性,频谱应当只有在15Hz,40Hz出现峰值,但是fft变换后在60Hz,及85Hz处同样出现了峰值,应当可以从fft的计算过程中得到相应的解释。

事实上,如果我们用15Hz,60Hz来测试fft变换,也即是 y = 0.5*sin(2*pi*15*t)+2*sin(2*pi**t);图像如下所示,没有任何变化。

这种现象提醒我们,频率在f_s以内,即 0<f<f_s,f 以及 f_s – f 都有可能是测试信号的频率谱,这就给我们带来了歧义。并且从第三个子图也可以看出,这时候的fftshift会给我们带来错误的引导,也就是说,如果我们试图采样fft或者fftshift来分析信号的频率谱显得不那么靠谱了,matlab的fft谱线与信号的实际频率并不是一一对应的映射关系。这当然不是我们所期望看到的结果,所以实际分析信号时,有关这个问题需要额外的注意。

实际上,这也就间接地证明了Nyquist采样定理的合理性:采样频率要高于截止频率的两倍,上面的处理中我们所使用的采样频率为100Hz,于是当截止频率超过50Hz时,就会出现混叠效应,特殊情况就如上图所示:完全一样。于是,这也就告诉我们若要正确的显示频谱,需要仔细地考量采样频率与截止频率的关系,若太小,则有可能出现混叠,若太大,则计算代价过高。

[转载]Matlab中fft与fftshift命令的小结与分析的更多相关文章

  1. [转载]MATLAB中FFT的使用方法

    http://blog.163.com/fei_lai_feng/blog/static/9289962200971751114547/ 说明:以下资源来源于<数字信号处理的MATLAB实现&g ...

  2. MATLAB中FFT的使用方法

    MATLAB中FFT的使用方法 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X, ...

  3. MATLAB中fft函数的正确使用方法

    问题来源:在阅读莱昂斯的<数字信号处理>第三章离散傅里叶变换时,试图验证实数偶对称信号的傅里叶变换实部为偶对称的且虚部为零.验证失败.验证信号为矩形信号,结果显示虚部是不为零且最大幅值等于 ...

  4. matlab中fft快速傅里叶变换

    视频来源:https://www.bilibili.com/video/av51932171?t=628. 博文来源:https://ww2.mathworks.cn/help/matlab/ref/ ...

  5. [转载]Matlab中插值函数汇总和使用说明

    http://blog.sciencenet.cn/blog-457143-679275.html MATLAB中的插值函数为interp1,其调用格式为:  yi= interp1(x,y,xi,' ...

  6. [转载] Linux中的搜索文件命令

    搜索文件用处很大,我们往往需要知道一个文件存放在什么地方,我们又知道Linux是命令强大的一个系统,所以也有好多非常优秀的搜索命令.通常find不常用,因为速度慢,耗费硬盘空间.通常我们先使用wher ...

  7. matlab 中fft的用法

    一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X,N) 用MATLAB进行谱分析时注意: (1)函数FFT返回值的数据结构具有对称性. 例:N=8;n=0:N- ...

  8. [转载]MATLAB中神经网络的函数

    1.设计函数 solvein    设计线性网络:                solverb   设计径向基网络:                      solverbe    设计精确的径向 ...

  9. [引用]MATLAB中的fft后为何要用fftshift

    原文地址:MATLAB中的fft后为何要用fftshift fft是一维傅里叶变换,即将时域信号转换为频域. fftshift是针对频域的,将FFT的DC分量移到频谱中心,重新排列fft,fft1和… ...

随机推荐

  1. javascript正则简单入门

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 写个点击input框 下方弹出月份时间等

    <input type="text" name="test" id="test" value="" "& ...

  3. html链接

    1. <a href="/index.html">本文本</a> 是一个指向本网站中的一个页面的链接.</p><p><a hr ...

  4. uva 1597 Searching the Web

    The word "search engine" may not be strange to you. Generally speaking, a search engine se ...

  5. js 日期天数相加减,格式化yyyy-MM-dd

    参数格式: date :2016-03-02 days:-3(2)当为负数的时候日期往前推,为正数,日期往后推 function addDate(date, days) { var d = new D ...

  6. 禁用ubuntu的触摸板和独显

    #!/bin/bash #This is a vgaoff & touchpadoff #By spinestars #-2-18#TouchPad & VGA OFF == ];th ...

  7. 解决pip安装时 UnicodeDecodeError 问题

    在装django的时候用pip安装就出现了问题,一大堆的红字,然后联想到很多次用pip安装都以失败告终,于是今天抽空看了看出现问题的原因. 情况如下图:

  8. C语言程序的结构分析

    一个C语言源程序可以由一个或多个源文件组成. 每个源文件可由一个或多个函数组成. 一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数. 源程序中可以有预处理命令(include ...

  9. Extjs Tooltip属性的使用

    要想让 tooltip生效必须:Ext.QuickTips.init();

  10. 从Qt4到Qt5的,主要的进化有三(对于QtWidget的精简和优化会很有限)

    从Qt4到Qt5的,主要的进化有三:1 语言的进化,原来是基于C++(qtwidget)和XML(.ui),现在添加了QML(QtQuick)+JS(v8)的架构.2 绘图系统的进化,原先基于QPai ...