goertzel_dtmf.c

Using the Goertzel algorithm to analyze DTMF signals.This program performs generating of 16 DTMF signals. Then there is performed calculating of DFT spectrum samples which correspond to DTMF tone frequencies by means of the Goertzel algorithm.

DTMF signals and amplitude values of DFT spectrum samples are saved as text files to plot charts.

As a result of running the program, 16 files of DTMF signal in time domain and 16 files which hold spectrum sample amplitudes corresponding to DTMF frequencies will be created in the 'dat' directory.

File of DTMF signal in time File of spectrum sample amplitudes symbol
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 signals kn time domainan and spectrum sample amplitudes corresponding to DTMF frequencies got as a result of the program operation can be plotted in charts:

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;
}

Select spelling error with your mouse and press Система Orphus