【问题标题】:Matlab Fast Fourier Transform / fft for time and speedMatlab 快速傅里叶变换 / fft 时间和速度
【发布时间】:2012-10-14 19:07:39
【问题描述】:

我有一个 2 列向量,其中包含数据子集的时间和速度,如下所示:

5 40
10 37
15 34
20 39

等等。我想获得速度的傅立叶变换以获得频率。我将如何使用快速傅立叶变换 (fft) 进行此操作?

如果我的向量名称是sampleData,我试过了

fft(sampleData);

但这给了我一个实数和虚数的向量。为了能够获得合理的数据进行绘图,我将如何做呢?

【问题讨论】:

    标签: arrays matlab vector matrix fft


    【解决方案1】:

    傅立叶变换将产生一个复矢量,当您得到一个频率矢量时,每个频率都有一个频谱相位。这些阶段可能非常重要! (它们包含时域信号的大部分信息,没有它们你不会看到干扰效应等......)。如果要绘制功率谱,可以

    plot(abs(fft(sampleData)));
    

    要完成这个故事,您可能需要 fftshift,并生成一个频率向量。这是一个更详细的代码:

    % Assuming 'time' is the 1st col, and 'sampleData' is the 2nd col: 
    N=length(sampleData);  
    f=window(@hamming,N)';
    dt=mean(diff(time)); 
    df=1/(N*dt); % the frequency resolution (df=1/max_T)
    if mod(N,2)==0
        f_vec= df*((1:N)-1-N/2); % frequency vector for EVEN length vector
        else
        f_vec= df*((1:N)-0.5-N/2); 
    end
    
    fft_data= fftshift(fft(fftshift(sampleData.*f))) ;
    
    plot(f_vec,abs(fft_data))
    

    【讨论】:

    • 如果我只用 plot(abs(fft(sampleData))); 绘制速度列,我得到功率谱。有没有办法将功率谱与时间值关联起来?
    • 另外,在运行完整代码(由您提供)时,我在 fft_data= fftshift(fft(fftshift(data.*f))) 上遇到错误;说明未定义的函数或变量“数据”。
    • 哎呀,数据 -> sampleData,将编辑。同样 plot(f_vec,abs(fft_data)) 和 x 轴单位将是 ~ 1/time
    • 即使是 sampleData,.*f 也会给我一个错误。使用错误。* 矩阵尺寸必须一致
    • sampleData 的维度可能是错误的(col 而不是 row,反之亦然)您可以省略 f,因为它只是一个用于校正边缘的窗口过滤器,或者省略 f 所在的 ' 符号已定义。
    【解决方案2】:

    我建议您备份并考虑您要完成的工作,以及 FFT 是否适合您的情况。你说你“想要……得到一个频率”,但你到底是什么意思?你知道这个数据只有一个频率分量,想知道频率是多少吗?您想知道组件的频率和相位吗?您是否只想大致了解存在多少离散频率分量?您对测量中的噪声频谱感兴趣吗?您可以就数据集中的“频率”提出很多问题,而 FFT 和/或功率谱是否是获得答案的最佳方法取决于问题。

    在上面的评论中,您问“有什么方法可以将功率谱与时间值相关联吗?”这让我觉得这是一个困惑的问题,但也让我觉得你真正想要回答的问题可能是“我有一个频率随时间变化的信号,我想估计频率与时间的关系”。我敢肯定,在过去的几个月里,我在 SO 上看到过类似的问题,所以我会搜索一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2012-08-21
      • 2010-12-13
      • 1970-01-01
      • 2012-11-18
      相关资源
      最近更新 更多