gpt4 book ai didi

c - DTMF Goertzel 算法不工作

转载 作者:行者123 更新时间:2023-12-02 22:44:07 28 4
gpt4 key购买 nike

所以我打开了一个我在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com