Dzwonienie o wartości rzeczywistej, gdy FFT o wypełnieniu zerowym nieparzystej długości

13

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:

  1. Reakcja długości - trzeba podzielić bin ponieważ jest on niejednoznaczny. Więc kopiuję ujemną część widma i dodam zera między nimi.fas/2)n*(interp-1)-1
  2. Dziwna odpowiedź - nie ma więc po prostu podziel częstotliwość dodatnią / ujemną i wstaw zero między nimi.fas/2)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):50μs

Problem polega na transformacji nieparzystej długości, dostaję dość ohydną przejściową odpowiedź tylko na prawdziwych próbkach ( znowu , naprawdę):50μs

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?fas/2)fas/2)

gct
źródło
Twoje działki są trochę trudne do zobaczenia, ponieważ zostały zmniejszone.
Jason R
@Jason przepraszam, myślałem, że były połączone, poprawiłem HTML, aby mogli kliknąć teraz, aby wyświetlić pełny rozmiar.
gct
3
Czy masz kod lub przykładowy plik, którego używasz jako danych wejściowych? Należy pamiętać, że warunki brzegowe przyjęte przez DFT. W szczególności istnieje nieodłączne założenie, że sygnał zainteresowania ma charakter okresowy. Jeśli więc nie ma ciągłości między pierwszą a ostatnią próbką na wejściu o nieparzystej długości, możesz zobaczyć dzwonienie podobne do tego, co zaobserwowałeś. Możliwe, że próbka o równej długości jest bardziej ciągła od początku do końca, więc nie widzisz tego zjawiska.
Jason R
Nie mam danych w formacie, którego nikt inny nie byłby w stanie łatwo przetrawić, ale myślę, że masz rację. Właśnie wróciłem do pracy i ponownie skompilowałem kod / ponownie wygenerowałem sygnał testowy (ćwierkanie 10Hz-100Hz przez 1 sekundę) i ponownie uruchomiłem kod i nie dostałem dzwonka. Widziałem twój komentarz i zmieniłem częstotliwość na 10-100.314 i widzę teraz dzwonienie zarówno na parzystych, jak i nieparzystych transformacjach.
gct
1
Czy próbowałeś zastosować funkcję okna do swoich danych? To zwykle zmniejsza dzwonienie.
MarkSci

Odpowiedzi:

1

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.

użytkownik27575
źródło
0

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.

Jian
źródło