Cześć,
robię analizator widma sygnału akustycznego, oparty na STM32F103C8T6. Próbkowanie sygnału z częstotliwością 47kHz, FFT jest wyliczane na podstawie 256 próbek sygnału. Do obliczeń użyłem biblioteki CMSIS (fragment kodu który wykonuje wszystkie obliczenia poniżej).
O ile po podaniu podaniu na wejście mikrokontrolera pojedynczej sinusoidy z przedziału 100Hz-20kHz, otrzymuję zgodnie z oczekiwaniami, pojedynczy prążek reprezentujący tę częstotliwość, o tyle po podaniu sygnału złożonego z np. dwóch sinusoid, wysokość każdego prążka (amplituda sygnału) jest niższa o połowę. Im więcej sinusów w sygnale, tym mniejsze wartości amplitudy otrzymuję na wyjściu. Skrajnym przypadkiem jest biały szum, przy którym na wyjściu nie otrzymuję żadnych wyników, zupełnie jakby tego sygnału na wejściu nie było.
Od strony sprzętowej wszystko sprawdzone, sygnał dociera bez zniekształceń prosto do nóżki wejścia ADC STM. Sygnał jest zawieszony na sztucznej masie 1/2Vcc, następnie od wartości każdej próbki odejmuję połowę rozdzielczości ADC - zatem funkcja fft otrzymuje na wejściu wartości z przedziału (-2048;2048). Co może być przyczyną takiego zachowania?
Zgodnie z teorią Nyquista, fmax przy takim próbkowaniu powinna wynosić ponad 20kHz, więc to chyba nie jest kwestia nie nadążającego przetwornika?
Pozdrawiam,
xdiax
robię analizator widma sygnału akustycznego, oparty na STM32F103C8T6. Próbkowanie sygnału z częstotliwością 47kHz, FFT jest wyliczane na podstawie 256 próbek sygnału. Do obliczeń użyłem biblioteki CMSIS (fragment kodu który wykonuje wszystkie obliczenia poniżej).
Spoiler:
arm_cfft_radix4_init_f32(&S,FFT_SIZE,0,1);
arm_cfft_radix4_f32(&S,Input);
arm_cmplx_mag_f32(Input,Output,FFT_SIZE);
arm_cfft_radix4_init_f32(&S,FFT_SIZE,0,1);
arm_cfft_radix4_f32(&S,Input);
arm_cmplx_mag_f32(Input,Output,FFT_SIZE);
O ile po podaniu podaniu na wejście mikrokontrolera pojedynczej sinusoidy z przedziału 100Hz-20kHz, otrzymuję zgodnie z oczekiwaniami, pojedynczy prążek reprezentujący tę częstotliwość, o tyle po podaniu sygnału złożonego z np. dwóch sinusoid, wysokość każdego prążka (amplituda sygnału) jest niższa o połowę. Im więcej sinusów w sygnale, tym mniejsze wartości amplitudy otrzymuję na wyjściu. Skrajnym przypadkiem jest biały szum, przy którym na wyjściu nie otrzymuję żadnych wyników, zupełnie jakby tego sygnału na wejściu nie było.
Od strony sprzętowej wszystko sprawdzone, sygnał dociera bez zniekształceń prosto do nóżki wejścia ADC STM. Sygnał jest zawieszony na sztucznej masie 1/2Vcc, następnie od wartości każdej próbki odejmuję połowę rozdzielczości ADC - zatem funkcja fft otrzymuje na wejściu wartości z przedziału (-2048;2048). Co może być przyczyną takiego zachowania?
Pozdrawiam,
xdiax

Da się w jakiś sposób skonfigurować linker, żeby nie załączał zbędnych tabel ze współczynnikami? Bo np. wykorzystując 512 punktową FFT, raczej nie potrzebuję współczynników do 4096-punktowej. Oczywiście można bezczelnie je wywalić z pliku, ale to nie o to chodzi.