그래서 대담하게 생성 된 DTMF 톤의 .raw 파일을 열려고합니다. 나는 위키 피 디아 (wikipedia) 기사에서와 비슷한 통조림 goertzel 알고리즘을 사용했다. 그것은 올바른 숫자를 해독하는 것 같지 않습니다.DTMF 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;
}
각 음색의 길이를 확인하십시오. N은 측정하려는 톤의 길이보다 클 수 없습니다. – user877329
나는 이것을 결정하는 방법을 모르겠다 ... – BlackCow
디코딩 된 숫자는 N의 값에 따라 크게 다르지만 내가 원하는 모든 실제 값을 디코딩 할 수는 없다. 그것은 아마도 알고리즘이 단지 틀린가? 우리가 작동하게하기 위해해야 할 일이 무엇인지 알아낼 수 있다면 위키 백과를 작동시키는 것으로 업데이트하는 것이 좋을 것입니다! – BlackCow