Jump to content

    

CMSIS FFT, как получить энергетический спектр?

Добрый день,
Я использую плату STM32F429-Disco, беру сигнал с АЦП делаю FFT из CMSIS библиотеки и вывожу на экран амплитудный спектр, а как получить энергетический спектр из амплитудного?
Поискал в интернете, нашел формулы, но как их применить в реальной программе не понимаю.
Вот так получаю амплитудный спектр:

       /* Initialize the CFFT/CIFFT module, intFlag = 0, doBitReverse = 1 */
        arm_cfft_radix4_init_f32(&S, FFT_SIZE, 0, 1);
        
        /* Process the data through the CFFT/CIFFT module */
        arm_cfft_radix4_f32(&S, Input);
        
        /* Process the data through the Complex Magniture Module for calculating the magnitude at each bin */
        arm_cmplx_mag_f32(Input, Output, FFT_SIZE);

Может кто уже это все проходил, и подскажет?

Share this post


Link to post
Share on other sites
41 минуту назад, nvn сказал:

а как получить энергетический спектр из амплитудного?

я не знаю что такое энергетический спектр, побуду тут рядом с вами в теме - может кто расскажет что это такое?

Всегда использовал то что вы назвали "амплитудным спектром" , ну иногда переводил его в логарифмический вид.

Share this post


Link to post
Share on other sites
1 hour ago, nvn said:

Вот так получаю амплитудный спектр:

Может кто уже это все проходил, и подскажет?

Так возводите в квадрат и получаете величину пропорциональную энергии. Умножаете на сопротивление - получаете энергию ( в случае если время существует и оно линейно :wink3:).
Это ж закон Ома для линейных частотно независимых цепей.

 А так, конечно, надо еще брать FFT по току и перемножать с FFT по напряжению

Share this post


Link to post
Share on other sites
2 hours ago, Lmx2315 said:

я не знаю что такое энергетический спектр, побуду тут рядом с вами в теме - может кто расскажет что это такое?

Всегда использовал то что вы назвали "амплитудным спектром" , ну иногда переводил его в логарифмический вид.

Сам не знал, пока вот не пришлось столкнуться: https://wiki2.org/ru/Спектральная_плотность_мощности#Формальное_определение
 

58 minutes ago, AlexandrY said:

Так возводите в квадрат и получаете величину пропорциональную энергии. Умножаете на сопротивление - получаете энергию ( в случае если время существует и оно линейно :wink3:).
Это ж закон Ома для линейных частотно независимых цепей.

 А так, конечно, надо еще брать FFT по току и перемножать с FFT по напряжению

В результате FFT получил массив Output[]  с амплитудами. Их возводить в квадрат? То получу величину пропорциональную энергии, хм :mail1:

Share this post


Link to post
Share on other sites
3 hours ago, Aleksandr Baranov said:

что станет с нечетными гармониками

Все будут перемножены, но по порядку. Для каждой новой частоты будут свои четные гармоники.

Есть готовые решения - голосовые вокодеры.

Share this post


Link to post
Share on other sites

У вас результат комплексный? Может быть амплитуда и фаза. Это одно и то же, но разное представление.

Одно из свойств преобразования Фурье -- теорема Парсеваля. Она об энергии. Энергия до преобразования равняется энергии после преобразования. Поищите в инете детали:
https://ru.wikipedia.org/wiki/Теорема_Парсеваля

Share this post


Link to post
Share on other sites
2 hours ago, Tarbal said:

У вас результат комплексный? Может быть амплитуда и фаза. Это одно и то же, но разное представление.

теорема Парсеваля - это всего лишь о том, что возводить в квадрат можно как до, так и после FFT.
Но после FFT в квадрат придется возводить комплексные числа   
Но если возводить до, то часто придется отдельно делать FFT для напряжений (поскольку это нужней) и для мощностей. Т.е. два FFT
Вот и вся дилемма.  

Share this post


Link to post
Share on other sites
11 hours ago, AVI-crak said:

Перемножать уровень чётных гармоник, уже после бпф. БПФБПФ

после функции arm_cfft_radix4_f32 (&S, Input); получаем результат БПФ - массив с комплексными величинами в виде Input[] = {real[0], imag[0], real[1], imag[1], ...}
и такой же вопрос:

8 hours ago, Aleksandr Baranov said:

Что на что умножать? И что станет с нечетными гармониками?


 

 

3 hours ago, Tarbal said:

У вас результат комплексный? Может быть амплитуда и фаза. Это одно и то же, но разное представление.

Одно из свойств преобразования Фурье -- теорема Парсеваля. Она об энергии. Энергия до преобразования равняется энергии после преобразования. Поищите в инете детали:
https://ru.wikipedia.org/wiki/Теорема_Парсеваля

Да, формулы такие видел, но слаб в математике, и тем более их применению на ЭВМ :blush:
Надо в матлаб глянуть

59 minutes ago, AlexandrY said:

теорема Парсеваля - это всего лишь о том, что возводить в квадрат можно как до, так и после FFT.
Но после FFT в квадрат придется возводить комплексные числа   
Но если возводить до, то часто придется отдельно делать FFT для напряжений (поскольку это нужней) и для мощностей. Т.е. два FFT
Вот и вся дилемма.  

т.е. может я всё усложняю? т.к. :
после функции arm_cfft_radix4_f32 (&S, Input); получаем результат БПФ - массив с комплексными величинами в виде Input[] = {real[0], imag[0], real[1], imag[1], ...}
а функция:
arm_cmplx_mag_f32(Input, Output, FFT_SIZE) - Computes the magnitude of the elements of a complex data vector.  -- дает амплитуды?
а если применить:
arm_cmplx_mag_squared_f32 - Computes the magnitude squared of the elements of a complex data vector. -- а это то что мне нужно?
 

Share this post


Link to post
Share on other sites
11 minutes ago, nvn said:

arm_cmplx_mag_squared_f32 - Computes the magnitude squared of the elements of a complex data vector. -- а это то что мне нужно?

Точняк!

Но помнить, что это все для линейной пассивной нагрузки.

Share this post


Link to post
Share on other sites

Почему не используем Real FFT functions?

https://www.keil.com/pack/doc/CMSIS/DSP/html/group__RealFFT.html

Ну и для получения красивых картинок полезно накладывать окно, усреднять много спектров, выводить в логарифмическом масштабе.

Share this post


Link to post
Share on other sites
2 minutes ago, scifi said:

Почему не используем Real FFT functions?

https://www.keil.com/pack/doc/CMSIS/DSP/html/group__RealFFT.html

Ну и для получения красивых картинок полезно накладывать окно, усреднять много спектров, выводить в логарифмическом масштабе.

А лучше сразу в Simulink-е бросить блок из вкладки Power Spectrum Estimator и сгенерировать исходники под ARM Cortex-M
И Matlab сам там выберет самые подходящие функции из библиотеки CMSIS DSP 

Share this post


Link to post
Share on other sites
40 minutes ago, AlexandrY said:

А лучше сразу в Simulink-е бросить блок из вкладки Power Spectrum Estimator и сгенерировать исходники под ARM Cortex-M
И Matlab сам там выберет самые подходящие функции из библиотеки CMSIS DSP 

Как двое из ларца. Может, этот симулинк может пропустить все эти промежуточные шаги и сразу выдать зарплату? :beach:

Share this post


Link to post
Share on other sites
5 hours ago, nvn said:

Да, формулы такие видел, но слаб в математике, и тем более их применению на ЭВМ :blush:
Надо в матлаб глянуть


 

Ну так, https://www.mathworks.com/help/signal/ug/power-spectral-density-estimates-using-fft.html

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now