Перейти к содержанию
    

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);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

41 минуту назад, nvn сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, nvn said:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Lmx2315 said:

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

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

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

58 minutes ago, AlexandrY said:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Aleksandr Baranov said:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Tarbal said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. -- а это то что мне нужно?
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, nvn said:

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

Точняк!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 minutes ago, AlexandrY said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, nvn said:

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


 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...