Witam,
Od jakiegoś czasu "bawię" się w analizowanie sygnału. Nie mogę uporać się z jedną sprawą; Przekonwertowałem plik z muzyką na format raw(bez nagłówków, próbkowanie 44,100kHz 16bit signed), następnie przesyłam dane strumieniowo do mojego programu a ten przesyła do programu aplay.
/* ... */
#define N 1024
int main(int argc, char * argv[]){
double x[N];
double y[N];
short buf[N];
int i;
int len;
do{
len = fread(buf, 2, N, stdin); /* odczyt muzyki */
for(i=0; i<N; i++){
x[i] = buf[i];
y[i] = 0;
}
FFT(1, log2_(N), x, y); /* zamiana na widmo */
for(i=N/2; i<N; i++){ /* wyzerowanie ujemnych częstotliwości(A) */
x[i] = y[i] = 0;
}
for(i=100; i<N; i++){ /* "idealny" filtr dolnoprzepustowy(B) */
x[i] = y[i] = 0;
}
FFT(0, log2_(N), x, y); /* zamiana na dźwięk */
for(i=0; i<N; i++){ /* C */
buf[i] = x[i];
}
fwrite(buf, 2, N, stdout);
}while(len);
return 0;
}
// cat muzyka.raw | ./moj_program | aplay -r 44100 -f S16_LE
Zamieniając sygnał na widmo, powstaje odbicie lustrzane sygnału wejściowego względem środka - te częstotliwości "wyżej" nazwałem ujemnymi - wprowadzając sygnał zespolony(z przemiany czestotliwości), druga część wykresu właśnie pokazywała mi częstotliwości ujemne. Nie wiem jak zabardzo to interpretować w tym przypadku.
Częstotliwości ujemne zeruje w punkcie A, oczywiście głośność końcowa dźwięku będzie mniejsza, ale nie zniekształca sygnału. Problem pojawia się w punkcie C, tutaj chcę przepuścić dalej tylko niskie częstotliwości; działać działa, tylko słychać charakterystyczne przeskoki pomiędzy następną analizą(44100/1024 razy na sekundę występują te pyknięcia). Teoretycznie nie byłoby problemu jakbym zamienił cały sygnał na widmo i go obrobił, ale właśnie jak musi się różnić obróbka sygnału który jest podzielony na paczki(1024 próbek) jak w tym przypadku?
Nie mogę znaleźć na internecie jakiegoś opisu dotyczącego filtracji oraz przesuwaniu częstotliwości. Ma ktoś z was jakieś materiały na ten temat?