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?