Primer 2 - Filtriranje šuma
Koristeći MA filter, ukloniti šum signalu iz prvog primera.
Rešenje
#include <math.h>
#include <stdlib.h>
#define DUZINA 500 // u zadatku se trazi tabela duzine 500 odbiraka
unsigned int signal[DUZINA]; // trazi se da signal bude unipolaran
void generisi_signal(unsigned int s[], int n, int f, int fs, int offset, int ampl ) {
int i;
for (i=0; i<n; i++) {
s[i] = offset + ampl*sin((6.28*f*i)/fs);
}
}
void dodaj_sum(unsigned int s[], int n, int ampl) {
int i;
for (i=0; i<n; i++) {
s[i] += rand()%ampl;
}
}
// Funkcija i primeri za koriscenje funkcije se nalaze na adresi:
// https://vlmitrovic.gitbooks.io/pdsp/content/moving-average-filter.html
void MAF (unsigned int x[], int duz, int M) {
int i, j, y;
long suma;
for (j=0; j<duz-M; j++) {
suma = 0;
for (i=j; i<j+M; i++) {
suma+=x[i];
}
y=suma/M;
x[j]=y;
}
}
int main(void) {
// u bafer koji se zove "signal" i duzine je "DUZINA"
// smestiti odbirke sinusnog signala frekvencije 70Hz,
// frekvencija odabiranja je 10kHz
// posto se trazi da signal bude unipolaran, njegov ofset je 32767
// posto se trazi da amplituda suma bude 25% amplitude signala
// formula za racunanje amplituda je sledeca:
// ampl+(25/100)*ampl = 32768 iz cega sledi da je ampl=26213 sto je amplituda signala
// a amplituda suma je (25/100)*ampl odnosno 6553
generisi_signal(signal, DUZINA, 70, 10000, 32767, 26213);
dodaj_sum(signal, DUZINA, 6553);
// Primeni MAF
MAF(signal, DUZINA, 20);
while(1); // mrtva petlja
}