W VisualDSP++ 3.0 dla Ez-kit Lite można znaleźć "bandpass filter demo". Działa to mniej więcej w taki sposób:
pełny listing pliku bp.c możecie znaleźć tutaj:
http://wisnia.server.pl/fir/bp.c
plik fir.h jest tu:
http://wisnia.server.pl/fir/fir.h
a to jego matlabowy wykres freqz():
http://wisnia.server.pl/fir/fir.jpg
I TO WSZYSTKO DZIAŁA POPRAWNIE !
Ponieważ nie znalazłem żadnej "poważnej" dokumentacji do tego przykładu, a także do funkcji fir(), a chciałem uzyskać filtr o określonej częstotliwości przepuszczania, popróbowałem zrobić własny plik ze współczynnikami, używają matlaba i jego:
1. funkcji fir1():
2. lub funkcji remez():
dzięki tym zabiegom powstało coś takiego:
http://wisnia.server.pl/fir/myfir.h
co jak widać, w matlabie wygląda bardzo ładnie:
http://wisnia.server.pl/fir/myfir.jpg
ale niestety - po podstawieniu mojego fir.h (na jakie f by nie był) za "fabryczny-przykładowy" fir.h, filtr zaczyna przepuszczać całe pasmo ! nawet jeśli nie używam funkcji fir(), a własnego algorytmu FIR, dzieje się to samo:
1. "fabryczne" współczynniki - filtr działa
2. "matlabowe" współczynniki - filtr przepuszcza całe pasmo
nie wiem, co robię źle, bo według tego co udało mi się wyguglać, moje współczynniki powinny działać. czy ktoś robił coś podobnego ? na co zwrócić uwagę ?
próbowałem zmieniać częstotliwości, pasma, f nyquista, f próbkowania, ilości współczynników, dodawać zera, cudować... nic.
Pomóżcie proszę !
.
.
.
#define NUM_TAPS 256
// tutaj pobiera plik fir.h zawierajacy 256 wspolczynnikow dla FIR
float pm coeffs[NUM_TAPS] =
{
#include "fir.h"
};
float dm state[NUM_TAPS+1];
.
.
.
// i uzywa takiej funkcji fir() zawartej w zewnetrznej bibliotece:
tx_buf[1] = fir( rx_buf[1], &coeffs[0], &state[0], (int)NUM_TAPS );
.
.
.
pełny listing pliku bp.c możecie znaleźć tutaj:
http://wisnia.server.pl/fir/bp.c
plik fir.h jest tu:
http://wisnia.server.pl/fir/fir.h
a to jego matlabowy wykres freqz():
http://wisnia.server.pl/fir/fir.jpg
I TO WSZYSTKO DZIAŁA POPRAWNIE !
Ponieważ nie znalazłem żadnej "poważnej" dokumentacji do tego przykładu, a także do funkcji fir(), a chciałem uzyskać filtr o określonej częstotliwości przepuszczania, popróbowałem zrobić własny plik ze współczynnikami, używają matlaba i jego:
1. funkcji fir1():
FSover2 = 8000;
Filters = [ 800 ];
TAPS = [ 256 ];
WIDTH = 200;
.
.
b = fir1(TAPS(j),[(Filters(i)/FSover2 - WIDTH/FSover2) (Filters(i)/FSover2 + WIDTH/FSover2)]);
.
.
.
fprintf(fid,' %6.10f,\n',b(k));
.
.
2. lub funkcji remez():
Fs=8000; fp=500; fz=800; TAPS = 256;
[n,fo,mo,w]=remezord( [fp fz], [1 0], [0.01 0.1], Fs );
b = remez(n,fo,mo,w);
.
.
dzięki tym zabiegom powstało coś takiego:
http://wisnia.server.pl/fir/myfir.h
co jak widać, w matlabie wygląda bardzo ładnie:
http://wisnia.server.pl/fir/myfir.jpg
ale niestety - po podstawieniu mojego fir.h (na jakie f by nie był) za "fabryczny-przykładowy" fir.h, filtr zaczyna przepuszczać całe pasmo ! nawet jeśli nie używam funkcji fir(), a własnego algorytmu FIR, dzieje się to samo:
1. "fabryczne" współczynniki - filtr działa
2. "matlabowe" współczynniki - filtr przepuszcza całe pasmo
nie wiem, co robię źle, bo według tego co udało mi się wyguglać, moje współczynniki powinny działać. czy ktoś robił coś podobnego ? na co zwrócić uwagę ?
próbowałem zmieniać częstotliwości, pasma, f nyquista, f próbkowania, ilości współczynników, dodawać zera, cudować... nic.
Pomóżcie proszę !