- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我打开了一个我在 audacity 中生成的 DTMF 音调的 .raw 文件。我抓取了一个类似于维基百科文章中的 jar 装 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 音这样简单的事情也是如此。它实际上是一个 band-pass filter - 它挑选出以给定频率为中心的频带。这实际上是一件好事 - 您不能指望您的采样音调完全是您尝试检测的频率。
棘手的部分是尝试设置滤波器的带宽 - 将被过滤以检测特定音调的频率范围有多宽。
关于 Wikipedia page 的引用文献之一关于这个主题(准确地说是 this one)讨论了在 DSP 中使用 Goertzel 算法实现 DTMF 音调检测。 C 的原理是相同的——要获得正确的带宽,您必须使用提供的常量的正确组合。显然没有简单的公式——论文提到必须使用 brute force search , 并提供以 8kHz 采样的 DTMF 频率的最佳常数列表。
关于c - DTMF Goertzel 算法不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10310362/
我开发了 android 应用程序,可以在单击按钮时调用其他人,但现在我想在需要时将 dtmf 音调从应用程序发送到该呼出电话。那么该怎么做呢? 最佳答案 其实是可以的。它不是那么明显,也不是那么优雅
我有以下拨号方案: exten => 224,1,NoOp(IN CALL : ${CALLERID(num)} => ${EXTEN}) exten => 224,n,Dial(${
我想知道是否有人遇到过在 iPhone SDK 中生成铃声的方法。我正在尝试生成 DTMF 音调,但似乎找不到任何实质性内容。我还希望能够指定播放音调的时间(即模拟按住按钮而不是简单地按下按钮....
所以我打开了一个我在 audacity 中生成的 DTMF 音调的 .raw 文件。我抓取了一个类似于维基百科文章中的 jar 装 goertzel 算法。虽然它似乎没有解码正确的数字。 解码后的数字
我正在尝试为基于 WebRTC 的 Android/iOS 应用程序实现 DTMF。是否有适用于 Android 的 DTMF API?我试过调用以下内容: m_peerConnectionFacto
所以我打开了一个我在 audacity 中生成的 DTMF 音调的 .raw 文件。我抓取了一个类似于维基百科文章中的 jar 装 goertzel 算法。虽然它似乎没有解码正确的数字。 解码后的数字
我正在尝试为基于 WebRTC 的 Android/iOS 应用程序实现 DTMF。是否有适用于 Android 的 DTMF API?我试过调用以下内容: m_peerConnectionFacto
我需要在我的应用程序中开发拨号盘,就像原生 iPhone 手机应用程序拨号盘一样。我已将 .wav 文件添加到我的项目中,以便在单击数字按钮时播放声音,但它们太大声了。但 iPhone 手机应用程序拨
我正在尝试执行以下操作 我正在使用我的 java 应用程序给另一个人打电话(已经完成并且工作正常)。 然后我正在播放录音,例如“请按 1 以继续用英语”(已经完成并且工作正常)。 现在我想检测那个人按
我已经阅读了有关用于检测带内 dtmf 的 freeswitch 中的 start_dtmf 应用程序。 我已经测试过这个,但它没有检测到任何 DTMF。 请帮我。 最佳答案 老问题,但值得
我只需要一段 java 代码,它可以从麦克风中检测 DTMF,并将字符打印到 System.out。我一直在寻找,但找不到。 最佳答案 关于用 Java 捕获音频的 Oracle 文档: http:/
从此处找到的示例开始:https://trac.pjsip.org/repos/wiki/Getting-Started/Android ,我设法构建并运行了 pjsua2 示例应用程序。 问题是我无
有什么方法可以动态生成上行链路 DTMF 音(即接收器听到它)? 当我查看 android 源代码时,我看到了一个名为 startDTMF() 的函数,这正是我所需要的,但我找不到任何允许我访问该函数
我正在使用 android SIP(android.net.sip) 进行 VOIP 通话。正在尝试发送 DTMF。在SipAudioCall类的android中给出了两个方法 void sendDt
我想在接听电话后调用一个号码,这通常是通过通话中的拨号盘完成的。 我尝试了以下方法,但开始调用新电话(ACTION_VIEW 也是如此)。 Intent dial = new Intent(Inten
我正在调用一个带有号码的通话应用程序,然后通过 发送 dtmf 音 String number = "tel:+1234567,890#"; Intent c1 = new Intent(androi
Android 的新手。我有一个应用程序正在运行,我正在生成 DTMF 信号并解释微 Controller 生成的内容。我成功地生成了音调,但是音调是通过扬声器播放的,我想通过一个拼接的耳机插孔播放音
我有一个拨号方案,我想要的是,如果用户按任意键然后再次播放文件,但我不明白如何在拨号方案中获取dtmf 值。这是我的拨号方案: [callme] exten => s,1,Answer exten
我正在开展一个项目,该项目要求我的应用能够在通话期间以语音的上行链路频率发送 DTMF 音。 我的两个条件是: 我们不使用定制的 Android 平台 我们不需要root手机 我花了几天时间做功课,并
我正在将 CallKit 与 VOIP 应用集成。我能够拨入和拨出电话。我遵循了以下步骤: 配置 Audio Session 在(didActivate)中启动音频 在(didDeActivate)中
我是一名优秀的程序员,十分优秀!