Russian Qt Forum
Ноябрь 22, 2024, 12:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Быстрое преобразования фурье. Определение частот.  (Прочитано 14207 раз)
Yegor
Гость
« : Июнь 13, 2013, 22:33 »

Здравствуйте!

Мне нужно определить частоты входного сигнала. Для этого есть библиотека FFTReal. Там есть функция transform, которое делает быстрое преобразование Фурье. В нее передается массив сигнала. Результатом функции является другой, выходной массив.
Подскажите, пожалуйста, как этот выходной массив использовать? Что с ним делать, чтобы определить частоты, громкость частот?
« Последнее редактирование: Июнь 19, 2013, 21:13 от Yegor » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Июнь 13, 2013, 23:50 »

Здравствуйте!

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

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Yegor
Гость
« Ответ #2 : Июнь 14, 2013, 09:40 »

В том и дело, что в документации FFTReal ничего понятного не написано. Под громкостью частот я имею ввиду ДБ для каждой частоты.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #3 : Июнь 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
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #4 : Июнь 14, 2013, 10:31 »

Можно в примерах Qt 5 посмотреть
\Src\qtmultimedia\examples\multimedia\spectrum\
Записан
Yegor
Гость
« Ответ #5 : Июнь 14, 2013, 11:25 »

В Qt5 пример сложный, и без комментариев.
Кто работал с FFTReal, помогите!
Получаешь преобразованный ряд Фурье - результат функции transform. И что с ним делать дальше?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 14, 2013, 11:45 »

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

Да, при анализе часто возникает "парадокс Фурье", типа "лампочка зажглась раньше чем ее включили"  Улыбающийся
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #7 : Июнь 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);
 
« Последнее редактирование: Июнь 14, 2013, 11:59 от xokc » Записан
Akon
Гость
« Ответ #8 : Июнь 21, 2013, 11:07 »

Я не работал с ФФТРеал, но задача типовая. Полагаю, трансформ выдает результат БПФ, т.е. образ сигнала в частотной области (массив комплексных чисел в алгебраической форме). Далее, из этого образа можно найти амплитудный спектр (ваша громкость). Амплитудный спектр еще называют модулем. Ищите соответствующую функцию в ФФТРеал или делайте сами: смотрите, где в выходном массиме находятся гармоники одной частоты, переводите их в экспоненциальную форму. Множитель перед экспонентой и есть амплитуда на данной частоте. Амплитуда в квадрате - есть мощность на данной частоте.
Записан
Тимур
Гость
« Ответ #9 : Июль 03, 2013, 10:42 »

Для понимания FFT (БПФ) советую

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

« Последнее редактирование: Июль 03, 2013, 10:45 от Тимур » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 22.