Próbuję więc napisać interpolator w dziedzinie częstotliwości, który wypełnia zero odpowiedzi częstotliwościowej sygnału i przekształceń odwrotnych. Mam do czynienia z dwoma przypadkami:
- Reakcja długości - trzeba podzielić bin ponieważ jest on niejednoznaczny. Więc kopiuję ujemną część widma i dodam zera między nimi.
n*(interp-1)-1
- Dziwna odpowiedź - nie ma więc po prostu podziel częstotliwość dodatnią / ujemną i wstaw zero między nimi.
n*(interp-1)
Kod wypełniający zerowanie można zobaczyć tutaj
// Copy negative frequency components to end of buffer and zero out middle
// inp - input buffer of complex floats
// n - transform size
// interp - interpolation amount
void zero_pad_freq(cfloat_t *inp, size_t n, size_t interp) {
if ((n % 2) == 0) {
memmove(inp + n*interp - n/2, inp + n/2, n/2*sizeof(cfloat_t));
memset (inp + n/2 + 1, 0, (n*(interp-1)-1)*sizeof(cfloat_t)); // Duplicate Fs/2 so we need one less zero
inp[n/2] /= 2.0;
inp[n*interp-n/2] /= 2.0;
} else {
memmove(inp + n*interp - n/2, inp + (n+1)/2, n/2*sizeof(cfloat_t));
memset (inp + (n+1)/2, 0, (n*(interp-1))*sizeof(cfloat_t));
}
}
Pierwszy przypadek działa dobrze, testuję go na sygnale ćwierkającym i interpoluje się dobrze, słychać trochę szumu numerycznego, ale jest on przewracany przez FFT, więc co możesz zrobić (pierwsze lub więcej pokaz sygnału):
Problem polega na transformacji nieparzystej długości, dostaję dość ohydną przejściową odpowiedź tylko na prawdziwych próbkach ( znowu , naprawdę):
Wyimaginowany kanał ma niewielką falę, ale nie jest aż tak zły:
To tak, jakbym spieprzył mój w dziwnym przypadku, ale nie ma , więc jestem bardzo zdziwiony. Czy ktoś ma jakieś przemyślenia?
źródło
Odpowiedzi:
Przez wyzerowanie przedziałów wysokiej częstotliwości skutecznie pomnożyłeś spektrum sygnału za pomocą funkcji prostokątnej. Mnożenie częstotliwości to splot w czasie, a para Fouriera odbicia to sinc. Tak więc to, co naprawdę zrobiłeś, to splot sygnału w dziedzinie czasu z cynkiem o szerokości głównego płata cynku odwrotnie proporcjonalnym do długości odbytnicy. Właśnie dlatego liczne techniki projektowania filtrów, takie jak konstrukcja Parks-McClellan, w tak zwanym paśmie „regionu przejściowego” lub „pasmie przejściowym”, dzięki czemu nie następuje natychmiastowa zmiana odpowiedzi częstotliwościowej filtra. Te techniki projektowania filtrów są ważne, ponieważ „idealny” filtr, taki jak używany, ma tak niepożądane efekty w dziedzinie czasu.
źródło
Krok w dziedzinie częstotliwości pojawi się jako zmarszczki w dziedzinie czasu. Jeśli wygładzisz dane częstotliwości za pomocą funkcji okna (np. Okno Hamminga), powinno to znacznie zmniejszyć tętnienia.
źródło