使用滑动窗口FFT确定与时间相关的频率

时间:2017-08-03 19:41:40

标签: matlab fft frequency-analysis hamming-window

我有一台产生大致正弦数据的仪器,但频率随时间略有变化。我正在使用MATLAB来构建一些代码来描述时间依赖性,但我遇到了一些问题。

我正在生成我的数据的理想化近似值, I(t)= sin(2 pi f(t)t),其中 f(t)变量但是目前测试为线性或二次。然后我实现滑动汉明窗口(宽度 w )以生成一组对应于数据点的傅里叶变换 F [I(t),t'] I(t)中,每个 F [I(t),t'] 与高斯拟合,以更精确地确定峰位置。

我目前的MATLAB代码是:

Sub copyFromRecordset()

    Set conn = New ADODB.Connection
    Set wipData = New ADODB.Recordset

    conn.ConnectionString = conStr
    conn.Open

    With wipData
        .ActiveConnection = conn
        .Source = "WipBin"
        .LockType = adLockReadOnly
        .CursorType = adOpenForwardOnly
        .Open
    End With

    Worksheets.Add
    Range("A2").copyFromRecordset wipData

    wipData.Close
    conn.Close

End Sub

我的思维过程是每个 F [I(t),t'] 中的峰值位置应该是窗口中心频率的近似值,用于生产它。但是,实验似乎并非如此。

我过去使用离散傅立叶分析来解决工程问题取得了一些成功,但我只完成了连续傅立叶变换的课程 - 所以可能会有一些明显缺失的东西。另外,这是我在StackExchange上的第一个问题,所以欢迎建设性的批评。

1 个答案:

答案 0 :(得分:0)

事实证明,我的问题是对正弦函数数学的理解不足。我假设波的频率等于时间变量乘以的任何值(例如 sin(ft)中的 f )。然而,事实证明,频率实际上是由正弦函数的整个参数的导数定义的 - 相位的变化率。

对于常量 f ,两个定义相等,因为 d(ft)/ dt = f 。但是,比方说, f(t)= sin(t)

d(f(t)t)/ dt = d(sin(t)t)/ dt = t cos(t)+ sin(t)

频率随f(t)的变化而变化。将函数定义更改为以下问题解决了我的问题:

f = @(t) 100-30*(t-0.5).^2; %Frequency function (Hz)
G = cumsum(f(t))/fs; %Phase function (Hz)
I = sin(2*pi*G); %Sampling function