什么是“[0,1) 范围内的归一化频率”,à la DTMF & Goertzel 算法

信息处理 fft
2022-02-01 21:55:26

我有一个正常运行的 DTMF 程序。它需要一个较大的信号并将其分解为许多小分量,然后使用 FFT 分析每个片段以确定是否存在对应于特定频率的特定“bin”的响应幅度,从而表明数量以该频率为代表的频率已被按下,直截了当,但我想实现库 jmathstudio 的 Goertzel 算法,但我不太清楚如何搜索我想要的频率。文档是这样说的: 在此处输入图像描述

我像这样构建 bin,术语“200”是由我的 FFT 当前大小为 400 的事实决定的,而 2000 是由采样率为 4000 的事实决定的。

int sixNineSeven = (int)(697.0*200/2000);
int sevenSevenZero = (int)(770.0*200/2000);
int eightFiveTwo = (int)(852.0*200/2000);
int nineFourOne = (int)(941.0*200/2000);

int twelveZeroNine = (int)(1209.0*200/2000);
int thirteenThirtySix = (int)(1336.0*200/2000);
int fourteenSeventySeven = (int)(1477.0*200/2000);

我想我需要做的主要事情是这一步:

[0,1) 范围内的归一化频率

但这是否意味着我可以完全忽略采样频率?

我想我会做这个 Geortzel 操作来代替 FFT,所以我应该只在每个小段中搜索这个归一化频率吗?

但是当我这样做时:

   Complex coeff = su.goertzelFrequencyAnalysis(new Vector(c), (float)(1/697));

   System.out.println("coeff "+coeff);

我的输出只是一堆像这样的垃圾:

   coeff org.JMathStudio.DataStructure.Complex@5e228a02
   coeff org.JMathStudio.DataStructure.Complex@7bd63e39
   coeff org.JMathStudio.DataStructure.Complex@2e8f4fb3
   coeff org.JMathStudio.DataStructure.Complex@42b988a6
1个回答

归一化频率“1”对应于奈奎斯特频率,即采样频率的一半。所以归一化频率w从频率获得f以赫兹为单位

w=2ffs

在哪里fs是采样频率。

对应于某个 bin 的频率(以 Hz 为单位)i(0iN1) 的 FFT 长度N

fi=ifsNi=0,1,,N1

对于实值信号,箱i=N/2+1(假设N是偶数)到i=N1是多余的。