goertzel_dtmf.c

Использование алгоритма Гёрцеля для анализа сигналов DTMF.Данная программа производит генерирование 16-ти DTMF сигналов тонового набора номера. После производится расчёт спектральных отсчётов ДПФ соответствующих частотам тонов DTMF при помощи алгоритма Гёрцеля.

DTMF сигналы и значения амплитуды спектральных отсчётов ДПФ сохраняются в текстовые файлы для построения графиков.

В результате выполнения программы, в директории dat будут созданы 16 файлов временных осциллограмм DTMF сигналов а также 16 файлов хранящих амплитуды спектральных отсчётов соответствующих частотам DTMF

Файл временных осциллограмм Файл амплитуд спектральных отсчётов символ
sym_0_time.txt sym_0_freq.txt [0]
sym_1_time.txt sym_1_freq.txt [1]
sym_2_time.txt sym_2_freq.txt [2]
sym_3_time.txt sym_3_freq.txt [3]
sym_4_time.txt sym_4_freq.txt [4]
sym_5_time.txt sym_5_freq.txt [5]
sym_6_time.txt sym_6_freq.txt [6]
sym_7_time.txt sym_7_freq.txt [7]
sym_8_time.txt sym_8_freq.txt [8]
sym_9_time.txt sym_9_freq.txt [9]
sym_a_time.txt sym_a_freq.txt [a]
sym_b_time.txt sym_b_freq.txt [b]
sym_c_time.txt sym_c_freq.txt [c]
sym_d_time.txt sym_d_freq.txt [d]
sym_s_time.txt sym_s_freq.txt [*]
sym_r_time.txt sym_r_freq.txt [\#]



Временные осциллограммы DTMF сигналов, а также амплитуды спектральных отсчётов соответствующих частотам DTMF, полученные в результате работы программы могут быть построены на графиках:

goertzel_dtmf_time.png
goertzel_dtmf_freq.png
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "dspl.h"
/* DFT size */
#define N 205
/* sample rate */
#define FS 8000
int main()
{
HINSTANCE hDSPL; /* dspl handle */
/* DTMF frequency vector */
double frq[8] = {697, 770, 852, 941, 1209, 1336, 1477, 1633};
/* DTMF DFT indexes (N = 205) */
int ind[8] = {18, 20, 22, 24, 31, 34, 38, 42};
char sym[16] = "123a456b789cs0rd";
char fn[24];
double t[N]; /* time */
double s[N]; /* DTMF signal */
double SR[8]; /* DFT image part */
double SI[8];
double S[8]; /* Spectrum magnitude */
int n, m, k;
/* Load dspl.dll */
hDSPL = dspl_load();
if(!hDSPL)
{
printf("dspl.dll loading ERROR!\n");
return 0;
}
for(n = 0; n < N; n++)
t[n] = (double)n/FS;
for(k = 0; k < 4; k++)
{
for(m = 0; m < 4; m++)
{
for(n = 0; n < N; n++)
s[n] = sin(M_2PI * frq[k] * t[n]) +
sin(M_2PI * frq[m+4] * t[n]);
dspl_goertzel(s, NULL, N, ind, 8, SR, SI);
for(n = 0; n < 8; n++)
S[n] = sqrt(SR[n]*SR[n] + SI[n]*SI[n]);
sprintf(fn, "dat/dtmf_sym_%c_time.txt", sym[k*4+m]);
dspl_writetxt(t, s, 201, fn);
sprintf(fn, "dat/dtmf_sym_%c_freq.txt", sym[k*4+m]);
dspl_writetxt(frq, S, 8, fn);
}
}
/* clear dspl handle */
FreeLibrary(hDSPL);
return 0;
}

Oбнаружили ошибку в тексте? Выделите ее мышкой и нажмите