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

results matching ""

    No results matching ""