Filtracja za pomocą TMS320c6713
Know-how
Krzysztof Grabiński
Zasada działania
Filtr
Filtr
z-1
+
z-1
z-1
+
+
z-1
y(n)
x(n)
x
x
x
x
b
0
b
1
b
2
b
N-1
Mnożymy aktualną próbkę i
127 ją poprzedzających przez
odpowiednie współczynniki
filtra
Realizacja
•
Tworzymy tablice do przetrzymywania np.
128 próbek:
short L_in[128];
•
Tworzymy tablice wcześniej wyliczonych
współczynników filtra o tym samym
wymiarze
•
Tworzymy funkcję filtracji
•
Konfigurujemy kodek Audio
•
Odpalamy aplikacje i podziwiamy efekt
naszej pracy
Współczynniki filtra
Wyliczamy za pomocą Matlaba wykorzystując skrypt od TI.
Podajemy następujące parametry:
A w efekcie otrzymamy tablice współczynników filtra
o zadanych parametrach:
Tłumienie filtra 8kHz
Funkcja filtracji
short FILTR_L (short input, short *h)
{
int i;
short output;
int acc=0;
int prod;
L_in[0] = input; /* ODŚWIEŻA NAJNOWSZA PRÓBKĘ */
acc = 0; /* ZERUJE AKUMULATOR */
for (i=0; i<128; i++)
/* PETLA WYKONA SIE 128 RAZY */
{
prod = (h[i]*L_in[i]); /* MNOŻENIE Q.15 */
acc = acc + prod; /* ODŚWIEŻANIE 32-bit AKUMULATORA */
}
output = (short) (acc>>15);
/* PRZERABIANIE WYJSCIA DO WARTOSCI
16-bits. */
for (i=127; i>0; i--)
/* PRZESUNIĘCIE PRÓBEK */
L_in[i]=L_in[i-1];
return output;
/* ZWRACA PRZEFILTROWANA
PRÓBKĘ */
}
Konfiguracja kodeka Audio
DSK6713_AIC23_Config config = {
0x0017, // 0 DSK6713_AIC23_LEFTINVOL
Glosnosc wejscia lewego kanalu
0x0017, // 1 DSK6713_AIC23_RIGHTINVOL
Glosnosc wejscia prawego kanalu
0x01f9, // 2 DSK6713_AIC23_LEFTHPVOL
Glosnosc lewego kanalu sluchawekF
0x01f9, // 3 DSK6713_AIC23_RIGHTHPVOL
Glosnosc prawego kanalu sluchawek
0x0011, // 4 DSK6713_AIC23_ANAPATH
kontrola analogowej sciezki audio
0x0000, // 5 DSK6713_AIC23_DIGPATH
kontrola cyfrowej sciezki audio
0x0000, // 6 DSK6713_AIC23_POWERDOWN
kontrola włączonych urządzeń
0x0043, // 7 DSK6713_AIC23_DIGIF
format interfejsu cyfrowego dzwieku
0x0081, // 8 DSK6713_AIC23_SAMPLERATE
kontrola czestotliwosci probkowania
0x0001 // 9 DSK6713_AIC23_DIGACT
aktywacja cyfrowego interfejsu
};
Biblioteki
#include "C6713_DSK_FIRcfg.h"
#define CHIP_6713 1
/* Biblioteki płytki DSK6713 i kodeka audio*/
#include "dsk6713.h"
#include "dsk6713_aic23.h"
VOID MAIN
void main()
{
DSK6713_AIC23_CodecHandle hCodec;
Int16 OUT_L,OUT_R;
Uint32 IN_L,IN_R;
/* INICJALIZACJA BIBLIOTEK */
DSK6713_init();
DSK6713_LED_init();
DSK6713_DIP_init();
/* WŁĄCZENIE KODEKA Z USTAWIENIAMI config */
hCodec = DSK6713_AIC23_openCodec(0, &config);
// USTAWIA CZĘSTOTLIWOŚĆ KODEKA NA 48KHz
DSK6713_AIC23_setFreq(hCodec, DSK6713_AIC23_FREQ_48KHZ );
Pętla główna
while (1) //PĘTLA NIESKOŃCZONA
{
// CZYTAJ PRÓBKĘ Z LEWEGO KANAŁU
while (!DSK6713_AIC23_read(hCodec, &IN_L));
// CZYTAJ PRÓBKĘ Z PRAWEGO KANAŁU
while (!DSK6713_AIC23_read(hCodec, &IN_R));
OUT_L = FILTR_L(IN_L, h2); //FILTRÓJ LEWĄ PRÓBKĘ FILTREM h2
OUT_R = IN_R;
//PRZEKAŻ PRÓBKĘ PRAWĄ BEZ FILTROWANIA
/* WYŚLIJ PRÓBKĘ DO LEWEGO KANAŁU */
while (!DSK6713_AIC23_write(hCodec, OUT_L));
/* WYŚLIJ PRÓBKĘ DO PRAWEGO KANAŁU */
while (!DSK6713_AIC23_write(hCodec, OUT_R));
}
HaPPy EnD
/* WYŁĄCZ KODEK */
DSK6713_AIC23_closeCodec(hCodec);
}