Russian Qt Forum

Qt => Мультимедиа => Тема начата: Yegor от Июнь 13, 2013, 22:33



Название: [Решено] Быстрое преобразования фурье. Определение частот.
Отправлено: Yegor от Июнь 13, 2013, 22:33
Здравствуйте!

Мне нужно определить частоты входного сигнала. Для этого есть библиотека FFTReal. Там есть функция transform, которое делает быстрое преобразование Фурье. В нее передается массив сигнала. Результатом функции является другой, выходной массив.
Подскажите, пожалуйста, как этот выходной массив использовать? Что с ним делать, чтобы определить частоты, громкость частот?


Название: Re: Быстрое преобразования фурье. Определение частот.
Отправлено: m_ax от Июнь 13, 2013, 23:50
Здравствуйте!

Мне нужно определить частоты входного сигнала. Для этого есть библиотека FFTReal. Там есть функция transform, которое делает быстрое преобразование Фурье. В нее передается массив сигнала. Результатом функции является другой, выходной массив.
Подскажите, пожалуйста, как этот выходной массив использовать? Что с ним делать, чтобы определить частоты, громкость частот?

А что написано в документации FFTReal? И что такое "громкость частот"?


Название: Re: Быстрое преобразования фурье. Определение частот.
Отправлено: Yegor от Июнь 14, 2013, 09:40
В том и дело, что в документации FFTReal ничего понятного не написано. Под громкостью частот я имею ввиду ДБ для каждой частоты.


Название: Re: Быстрое преобразования фурье. Определение частот.
Отправлено: alex312 от Июнь 14, 2013, 10:10
http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5

http://www.dsplib.ru/content/dft/dft.html


Название: Re: Быстрое преобразования фурье. Определение частот.
Отправлено: xokc от Июнь 14, 2013, 10:31
Можно в примерах Qt 5 посмотреть
\Src\qtmultimedia\examples\multimedia\spectrum\


Название: Re: Быстрое преобразования фурье. Определен&#
Отправлено: Yegor от Июнь 14, 2013, 11:25
В Qt5 пример сложный, и без комментариев.
Кто работал с FFTReal, помогите!
Получаешь преобразованный ряд Фурье - результат функции transform. И что с ним делать дальше?


Название: Re: Быстрое преобразования фурье. Определен&#
Отправлено: Igors от Июнь 14, 2013, 11:45
В Qt5 пример сложный, и без комментариев.
Кто работал с FFTReal, помогите!
Получаешь преобразованный ряд Фурье - результат функции transform. И что с ним делать дальше?
С FFTReal не работал, писал свое в начале 90-х, помню только "в принципе".  FFT делвет спектр - каждый элемент ряда - грубо говоря "синусоида" которая имеет частоту, фазу и амплитуду. Если сложить все эти синусоиды - получим опять исходный сигнал (с какими-то потерями). Манипулируя с элементами спектра можно достичь различных эффектов. Напр посмотреть насколько зашумлен сигнал - или убрать шумы просто занулив амплитуды гармоник с высокой частотой. Или сравнивая FFT результаты можно делать выводы на основаниии того какие частоты появляются там и сям. В общем применений много, непонятно зачем Вы берете вещь если у Вас нет цели  :)

Да, при анализе часто возникает "парадокс Фурье", типа "лампочка зажглась раньше чем ее включили"  :)


Название: Re: Быстрое преобразования фурье. Определен&#
Отправлено: xokc от Июнь 14, 2013, 11:57
В Qt5 пример сложный, и без комментариев.
А цифровая обработка сигналов вообще тема непростая.
Куда ещё проще пример-то (обрати внимание на наличествующие комментарии)?
spectrumanalyser.cpp
Код
C++ (Qt)
 
// Calculate the FFT
   m_fft->calculateFFT(m_output.data(), m_input.data());
 
   // Analyze output to obtain amplitude and phase for each frequency
   for (int i=2; i<=m_numSamples/2; ++i) {
       // Calculate frequency of this complex sample
       m_spectrum[i].frequency = qreal(i * inputFrequency) / (m_numSamples);
 
       const qreal real = m_output[i];
       qreal imag = 0.0;
       if (i>0 && i<m_numSamples/2)
           imag = m_output[m_numSamples/2 + i];
 
       const qreal magnitude = sqrt(real*real + imag*imag);
       qreal amplitude = SpectrumAnalyserMultiplier * log(magnitude);
 
       // Bound amplitude to [0.0, 1.0]
       m_spectrum[i].clipped = (amplitude > 1.0);
       amplitude = qMax(qreal(0.0), amplitude);
       amplitude = qMin(qreal(1.0), amplitude);
       m_spectrum[i].amplitude = amplitude;
   }
 

Ключевые места:
Код
C++ (Qt)
// Получение частоты
m_spectrum[i].frequency = qreal(i * inputFrequency) / (m_numSamples);
// Получение магнитуды для этой частоты
const qreal magnitude = sqrt(real*real + imag*imag);
// Получение амплитуды для этой частоты
qreal amplitude = SpectrumAnalyserMultiplier * log(magnitude);
 


Название: Re: [Решено] Быстрое преобразования фурье. Определение частот.
Отправлено: Akon от Июнь 21, 2013, 11:07
Я не работал с ФФТРеал, но задача типовая. Полагаю, трансформ выдает результат БПФ, т.е. образ сигнала в частотной области (массив комплексных чисел в алгебраической форме). Далее, из этого образа можно найти амплитудный спектр (ваша громкость). Амплитудный спектр еще называют модулем. Ищите соответствующую функцию в ФФТРеал или делайте сами: смотрите, где в выходном массиме находятся гармоники одной частоты, переводите их в экспоненциальную форму. Множитель перед экспонентой и есть амплитуда на данной частоте. Амплитуда в квадрате - есть мощность на данной частоте.


Название: Re: [Решено] Быстрое преобразования фурье. Определение частот.
Отправлено: Тимур от Июль 03, 2013, 10:42
Для понимания FFT (БПФ) советую

http://psi-logic.narod.ru/fft/fftf.htm
http://psi-logic.narod.ru/fft/fftg.htm