DTMF Goertzel 算法不起作用

2024-01-28

因此,我正在打开我在 audacity 中生成的 DTMF 音调的 .raw 文件。我抓住了一个类似于维基百科文章中的罐装 goertzel 算法。但它似乎无法解码正确的数字。

解码后的数字也会根据我传递给算法的 N 值而变化。据我了解,较高的 N 值可以提供更好的准确性,但不应改变正确解码的数字?

这是代码,

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double goertzel(short samples[], double freq, int N) 
{
double s_prev = 0.0;
double s_prev2 = 0.0;    
double coeff, normalizedfreq, power, s;
int i;
normalizedfreq = freq / 8000;
coeff = 2*cos(2*M_PI*normalizedfreq);
for (i=0; i<N; i++) 
{
    s = samples[i] + coeff * s_prev - s_prev2;
    s_prev2 = s_prev;
    s_prev = s;
}
power = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2;
return power;
}

int main()
{
FILE *fp = fopen("9.raw", "rb");
short *buffer;
float *sample;
int sample_size;
int file_size;
int i=0, x=0;

float frequency_row[] = {697, 770, 852, 941};
float frequency_col[] = {1209, 1336, 1477};
float magnitude_row[4];
float magnitude_col[4];

double result;

fseek(fp, 0, SEEK_END);
file_size = ftell(fp);
fseek(fp, 0, SEEK_SET);

buffer = malloc(file_size);

buffer[x] = getc(fp);
buffer[x] = buffer[x]<<8;
buffer[x] = buffer[x] | getc(fp);

while(!feof(fp))
{
    x++;
    buffer[x] = getc(fp);
    buffer[x] = buffer[x]<<8;
    buffer[x] = buffer[x] | getc(fp);
}

for(i=0; i<x; i++)
{
    //printf("%#x\n", (unsigned short)buffer[i]);
}
for(i=0; i<4; i++)
{
    magnitude_row[i] = goertzel(buffer, frequency_row[i], 8000);
}
for(i=0; i<3; i++)
{
    magnitude_col[i] = goertzel(buffer, frequency_col[i], 8000);
}

x=0;
for(i=0; i<4; i++)
{
    if(magnitude_row[i] > magnitude_row[x])
    x = i;
}
printf("Freq: %f\t Mag: %f\n", frequency_row[x], magnitude_row[x]);

x=0;
for(i=0; i<3; i++)
{
    if(magnitude_col[i] > magnitude_col[x])
    x = i;
}
printf("Freq: %f\t Mag: %f\n", frequency_col[x], magnitude_col[x]);
return 0;
 }

该算法实际上使用起来很棘手,即使对于检测 DTMF 音调这样简单的事情也是如此。它实际上是一个带通滤波器 http://en.wikipedia.org/wiki/Band-pass_filter- 它挑选出以给定频率为中心的频带。这实际上是一件好事 - 你不能指望你的采样音调是exactly您试图检测的频率。

棘手的部分是尝试设置滤波器的带宽 - 将过滤以检测特定音调的频率范围有多大。

参考文献之一维基百科页面 http://en.wikipedia.org/wiki/Goertzel_algorithm就此主题而言 (this one http://focus.ti.com/lit/an/spra168/spra168.pdf准确地说)讨论了在 DSP 中使用 Goertzel 算法实现 DTMF 音调检测。 C 的原理是相同的 - 要获得正确的带宽,您必须使用提供的常量的正确组合。显然没有简单的公式 - 论文提到必须使用暴力搜索 http://en.wikipedia.org/wiki/Brute-force_search,并提供以 8kHz 采样的 DTMF 频率的最佳常数列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DTMF Goertzel 算法不起作用 的相关文章

随机推荐

  • SQL 将列转换为逗号分隔的行

    如果名称相同 我尝试将用户名字段组合成逗号分隔的字符串 电流输出 由于 Name Admin 有 4 个用户链接到它 我试图显示为 电子邮件受保护 cdn cgi l email protection 电子邮件受保护 cdn cgi l e
  • 如何从地址调用不同的合约?

    在 Solidity 以太坊 中 人们需要合约地址来调用该合约 contract KittyInterface function getKitty uint256 id external view returns bool isGestat
  • 从 8 位转换为 1 字节

    我有一个 8 位的字符串 我想将其转换为 1 个字节 我不确定为什么我的功能无法正常工作 我将 8 位存储到 8 个无符号字符的数组中 到目前为止 这是我的方法 unsigned int bitsToBytes unsigned char
  • 设置默认区域 - 避免在网站上的每个链接上使用 `, new {area = ""}`

    此代码位于母版页内 li a href gt Main site link a li li a href gt Area link a li 所有链接都运行良好 直到我转到区域链接 当我去那里时 主要区域的所有路线都不起作用 为了解决这个问
  • 无法在 nunit 测试中打开 sqlconnection

    我有一个奇怪的问题 我无法弄清楚 我试图围绕一些数据库代码编写一些集成测试 但我的单元测试因奇怪的异常而失败 在控制台应用程序下正常运行代码效果很好 public static class DatabaseManager public st
  • 在 MATLAB 中在轴外添加图例而不重新缩放

    我在 MATLAB 中有一个 GUI 其中预先放置了一组轴 我使用图例的位置属性将其放置在轴的右侧 但是 通过这样做 轴会重新缩放 以便轴 图例占据轴的原始宽度 有什么办法可以避免重新调整大小吗 Example x 0 1 10 y sin
  • 哈希迭代不返回子目录内容

    我有一个方法可以查找给定父目录的子目录 我将父目录存储在哈希中 然后将哈希作为参数传递 我试图将子目录的内容收集到一个数组中 然后将其输出到报告中 我遇到了一个问题 数组的内容仅将目录存储在哈希的最后一个值中 我很快意识到内容在循环的每次迭
  • NUnit 无法构建测试 - 未发现测试

    我正在研究selenium网络驱动程序项目 我能够在中构建测试Test Explorer并执行 重建解决方案时 我立即收到以下错误 Unit Adapter 3 2 0 0 Test discovery starting NUnit VS
  • 缩小 Octave / gnuplot

    我在 Windows 下使用 Octave 和 gnuplot 我可以使用鼠标右键进行放大 但如何缩小用户界面呢 I found 纳布尔上的这篇文章 http old nabble com zoom td16353082 html 紧迫p带
  • 向 UITableViewCell 添加边距

    I am trying to achieve a view I mocked out on sketch I ve replicated it on Android cause I m really good on that platfor
  • Delphi - Graphics32,绘制抗锯齿圆角矩形

    如何使用 Graphics32 绘制抗锯齿圆角矩形 我设法在 bitmap32 画布上使用 TPolygon 制作了一个普通矩形 但我找不到任何绘制圆角的参考 希望有一些代码 function GetRoundedFixedRectangl
  • 致命:提交时无法解析 HEAD 错误

    每当我尝试提交工作时 都会收到此错误 fatal could not parse HEAD 如果我想保留我的更改 该怎么办 你知道什么分行吗HEAD应该指向 是吗master Run git symbolic ref HEAD refs h
  • Concourse:通过 HTTP 请求触发作业

    我正在尝试使用 Git 服务器上的 Web 挂钩触发 Concourse 作业 按照此Github 上的问题 https github com concourse concourse issues 331我找到了一个端点定义 https g
  • 谁能告诉我为什么我的算法是错误的?

    我正在研究单源最短路径问题 我对 bfs 进行了修改 可以解决该问题 该算法运行时间为 O 2E 次 我只是不明白为什么它是错误的 一定是这样 否则 dijstra 不会是最有效的算法 def bfs modified G src des
  • Cocos2d 游戏中的碰撞检测?

    我正在尝试检测碰撞 of two sprites按照以下方式 但是当我尝试运行游戏时没有发生碰撞 我可能做错了什么 void update ccTime dt CGRect projectileRect CGRectMake project
  • MongoDB:启动期间无法设置套接字

    我有 Windows 8 1 Enterprise 64 位机器 我已经为 Windows 安装了带有 SSL 支持的 mongodb msi 我创建了环境设置所需的所有必要条件 现在使用命令提示符导航到 mongodb 安装文件夹中的 b
  • 取消订阅 Single 的正确方法是什么[重复]

    这个问题在这里已经有答案了 我想做一些短暂的延迟后 public void notifyMe Single timer 500 TimeUnit MILLISECONDS subscribeOn Schedulers io subscrib
  • Rails 3.2.13 recognize_path 返回约束的路由错误

    我的路线中有两条路径 相同的路径指向不同的控制器和操作 match id gt users show as gt user constraints gt UserConstraint match id gt customers show a
  • 无法使用 ARIMA 预测下一个值:输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值

    我有以下代码片段 import pmdarima as pmd ts 3 86 5 52 68 14 20 12 22 4 2 model pmd auto arima ts start p 1 start q 1 test adf est
  • DTMF Goertzel 算法不起作用

    因此 我正在打开我在 audacity 中生成的 DTMF 音调的 raw 文件 我抓住了一个类似于维基百科文章中的罐装 goertzel 算法 但它似乎无法解码正确的数字 解码后的数字也会根据我传递给算法的 N 值而变化 据我了解 较高的