240 likes | 269 Views
Learn about DTMF generation and detection using the Goertzel algorithm on a DSP for telecommunications and digital signal processing applications. Covering DTMF signal parameters, tone generation techniques, and efficient Goertzel algorithm implementation.
E N D
DSP C5000 Chapter 17 DTMF generation and detection Dual Tone Multiple Frequency
Learning Objectives • DTMF signaling and tone generation. • DTMF signal generation • DTMF tone detection techniques and the Goertzel algorithm. • Implementation of the Goertzel algorithm for tone detection on DSP
Introduction • Dual Tone Multi-Frequency (DTMF) is a widespread used signalling system: telephone services use commonly key strokes for options selection • DTMF is mainly used by touch-tone digital telephone sets which are an alternative to rotary telephone sets. • DTMF has now been extended to electronic mail and telephone banking systems • It is easily implemented on a DSP as small part of the tasks.
DTMF Signaling • In a DTMF signaling system a unique combination of two normalized frequency tones • Two types of signal processing are involved: • Coding or generation. • Decoding or detection. • For coding, two sinusoidal sequences of finite duration are added in order to represent a digit.
Dual tone Generation A key stroke on « 9 » will generate 2 added tones, one at 852Hz low frequency and one at 1477Hz The 2 tones are Both audible.
Tones Generation • Dual tone generation can be done with 2 sinewave sources connected in parallel. • Different method can be used for such implementation: • Polynomial approximation • Look-up table • Recursive oscillator • DTMF signal must meet certain duration and spacing requirements • 10 Digits are sent per second. • Sampling is done via a codec at 8Khz • Each tone duration must be >40msec and a spacing of 50ms minimum between two digits is required
DTMF generation implementation • Tone generation of a DTMF is generally based on two programmable, second order digital sinusoidal oscillators, one for the low fl the other one for the high fh tone. • Two oscillators instead of eight reduce the code size. • Coefficient and initial conditions are set for each particular oscillation + + y(n) Low freq Z-1 + Z-1 + High freq Z-1 + Z-1
Digital oscillator parameters • 2 pole resonator filter with 2 complexe poles on the unit cercle (unstable) Output signal: Y(n)= -a1y(n-1)-y(n-2) Initial conditions: Y(-1)=0 Y(-2)=-A sin(w0) w0=2Pf0/fs f0 is the tone freq fs is the sampling freq
C55 sine generator code • Frames of data stream of 120 samples (15msec) long contain either DTMF tone samples or pause samples. • The encoder is either in idle mode, not used to encode digits or active and generates DTMF tones and pauses • The sine equation is implemented in assembly language: Mov a1/2, T1 ; coded in Q15 Mpym *AR1+,T1,AC0; ;AR1 y(n-1); AR1+1 y(n-2) sub *AR1-<<#16,AC0,AC ;AC1= a1/2*y(n-1)-y(n-2) Add AC0,AC1 ; AC1= a1*y(n-1)-y(n-2) ||delay *AR1 ;y(n-2)=y(n-1) Mov rnd(hi(AC1)),*AR1 ;y(n-1)=y(n) ; output signal pointer is AR1
DTMF Tone Detection • Goertzel algorithm is the more efficient detection algorithm for a single tone. • To detect the level at a particular frequency the DFT is the most suitable method: • The Goertzel algorithm is a recursive implementation • of the DFT , • 16 samples of the DFT are computed for 16 tones • See DTMF.pdf file for a complete description
Goertzel Algorithm Implementation • To implement the Goertzel algorithm the following equations are required: The only coefficient needed to compute output signal level is Cos(2pfk/fs)
Goertzel Algorithm Implementation Get N input samplex(n) Compute recursive part: Wk(n), n=0 to N-1 For 8 frequencies Calculate X2(k) for 8 freq Tests: Magnitude Harmonic Total Energy Output Digit
Goertzel Algorithm Implementation • The value of k determines the tone we are trying to detect and is given by: • Where: fk = frequency of the tone. fs = sampling frequency. N is set to 205. • Then we can calculate coefficient 2cos(2**k/N).
Frequency k Coefficient (decimal) Coefficient (Q15) 697 18 1.703275 0x6D02* 770 20 1.635585 0x68AD* 852 22 1.562297 0x63FC* 941 24 1.482867 0x5EE7* 1209 31 1.163138 0x4A70* 1336 34 1.008835 0x4090* 1477 38 0.790074 0x6521 1633 42 0.559454 0x479C Goertzel Algorithm Implementation N = 205 fs = 8kHz * The decimal values are divided by 2 to be represented in Q15 format (a1/2<1).
Goertzel Algorithm Implementation wn = x(n) - wn-2 + a1*wn-1; 0n<N-1 = sum1 + prod1 Where: a1= 2cos(2k/N) and N=205 This gives 205 MACs+ 205 ADD The last computation gives the energy of the tone and is done with: 2 SQRS and one multiplication |Yk(N) |2 = Q2(N) + Q2(N-1) -a1*Q(N)*Q(N-1)
void Goertzel (void) { static short delay; static short delay_1 = 0; static short delay_2 = 0; static int N = 0; static int Goertzel_Value = 0; int I, prod1, prod2, prod3, sum, R_in, output; short input; short coef_1 = 0x4A70; // For detecting 1209 Hz R_in = mcbsp0_read(); // Read the signal in input = (short) R_in; input = input >> 4; // Scale down input to prevent overflow prod1 = (delay_1*coef_1)>>14; delay = input + (short)prod1 - delay_2; delay_2 = delay_1; delay_1 = delay; N++; if (N==206) { prod1 = (delay_1 * delay_1); prod2 = (delay_2 * delay_2); prod3 = (delay_1 * coef_1)>>14; prod3 = prod3 * delay_2; Goertzel_Value = (prod1 + prod2 - prod3) >> 15; Goertzel_Value <<= 4; // Scale up value for sensitivity N = 0; delay_1 = delay_2 = 0; } output = (((short) R_in) * ((short)Goertzel_Value)) >> 15; mcbsp0_write(output& 0xfffffffe); // Send the signal out return; } Goertzel Algorithm Implementation ‘C’ code
C54 assembly programmeGoertzel tone detection routine ;Assume input signal x(n) is read through an I/O port at address 100h ;Output level Y(k)2 is sent to a port at address 1001h ;Scratch RAM reservation .bss wn,2 ;w(n-1) andw(n-2) .bss xn,1 ; input signal xn .bss Y,1 ; tone Energy .bss alpha,1 ;coefficient storage ; Constant initialisation alphap .word 0x68ADh ; a2/2 coefficient value at fs=8khz ; (prog memory) N .set 205 ;value of N ;DSP modes initialisation SSBX FRCT ;Product shift for Q15 format SSBX SXM ;Sign extension during shift RSXB OVA ; no overflowmode for A and B RSXB OVB
C54 assembly programme ;Data pointers Initialisation LD #wn,AR2 ; AR2 is pointing w(n-1) LD #xn,AR1 LD #Y,AR4 LD #alpha,AR3 MVPD #alphap,*AR3 ;Move alpha value to data RAM RPTZ #1 ;Accumulator A=0 STL A,*AR2+ , w(0) and w(-1) are set to 0 MAR *AR2- ; AR2 is pointing w(n-2)
Algorithm Core STM #N-1,BRC ; repeat block number RPTB loop-1 PORTR 100h,*AR1 LD *AR1,16,A ; AccH=x(n) SUB *AR2,16,A ;A=x(n)-w(n-2) MAC *AR2,*AR3,A ;A=x(n)-w(n-2)+alphaw(n-1) MAC *AR2,*AR3,A ;A=x(n)-w(n-2)+2alphaw(n-1) delay *AR2 ;w(n-2)=w(n-1) tap delay STH A,*AR2+ ;w(n-1)=w(n) tap delay Loop ;end of loop
Energy calculation LD *AR2,16,A ;A=w(N-1) MPYA *AR2- ;T=w(N-1) B=w(N-1)^2 MPY *AR2,A ;A=w(N)*w(N-1) LD *AR3,T ;T=alphap MPYA A ;A=alphap*w(N)*w(N-1) SUB A,1,B ; substract with a left shift to ;obtain 2alphap ; B=w(N-1)^2-2alphap*w(N)*w(N-1) LD *AR2,T ;T=w(N) MAC *AR2,B ;B=w(N-1)^2-2alphap*w(N)*w(N-1)+w(N)^2 STH *AR4 ;save to Y PORTW *AR4,101h ;copy output level
Universal MultifrequencyTone Generator and detector (UMTG) • This software module developed by SPIRIT Corp. for the TMS320C54x and TMS320C55X platform • It can be used into embedded devices for generating various telephone services used in intelligent network systems • Or as a simple tone generator for custom applications • It is fully compliant with TMS Algorithm standard rules See SPRU 639 and SPRU 638 AN
Follow on Activities • Application 7 for the TMS320C5416 DSK • Uses a microphone to pick up the sounds generated by a touch phone. The buttons pressed are identified using the Goerztel algorithm and their values displayed on Stdout. The frequency response of each Goertzel filter is given using Matlab.