Zadatak
Implementirati program koji u vektor INPUT smešta 500 odbirka složenog signala pripremljenog za izbacivanje na 12 bitni unipolarni konvertor. Učestanost odabiranja je 10KHz, a signal se sastoji od dve sinusoide učestanosti f1=50Hz i f2=1170Hz istih amplituda. Amplitude izabrati tako da ne dođe do izobličenja složenog signala. Provera rada se vrši u simulatoru.
Implementirati FIR low-pass i high-pass filtere, tako da se “odstrani” jedna odnosno druga frekvencija iz signala. Filter implementirati kao funkciju. U glavnom programu odbirke vektora INPUT propustiti kroz filter i filtrirane vrednosti smestiti u vektor OUTPUT. Provera rada se vrši u simulatoru.
Za projektovanje filtera koristiti FFD.
Napomena: Ako za projektovanje koristite TFilter, obratite pažnju da "fixed point precission (bits)" treba da bude setovano na 15 za Q15 format u kome radimo. Po defaultu je setovan na 16.
Rešenje
#include <math.h>
#define DUZINA_BAFERA 500
#define FILTER_TAP_NUM // Ovde dodje duzina kernela
static int filter_taps[FILTER_TAP_NUM] = {
// Ovde dodje kernel filtera
};
int input [DUZINA_BAFERA];
int output [DUZINA_BAFERA];
void Filter() {
volatile int i, j;
volatile long y;
static int xind = 0;
static long x[FILTER_TAP_NUM];
volatile int hind;
for (j=0; j<FILTER_TAP_NUM; j++) x[j]=0;
for (j=0; j<DUZINA_BAFERA; j++) {
y=0; // resetuj izlaz
x[xind] = input[j]; // ubaci ulaz u baffer
hind = FILTER_TAP_NUM - xind - 1;
for (i=0; i<FILTER_TAP_NUM; i++) {
y += filter_taps[hind] * x[i]; // MAC
if (++hind == FILTER_TAP_NUM) hind=0;
}
if (++xind == FILTER_TAP_NUM) xind=0;
output[j] = (int)(y >> 15); // izlaz Q15
}
}
void Signal() {
#define broj_freq 2 // broj sinusoida koje cine signal
int i,j;
int fs = 10000; // ucestanost odabiranja
int offset = 2048;
int freq[broj_freq] = {50, 1170}; // frekvencije sinusoida
int ampl[broj_freq] = {1023, 1023}; // apmplitude sinusoida
for (i=0; i<DUZINA_BAFERA; i++) {
input[i]=offset;
for (j=0; j<broj_freq; j++)
input[i]+=(ampl[j]*sin(6.28*freq[j]*i/fs));
}
}
void main(void) {
Signal();
Filter();
while(1);
}