192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
1 | |
Matlab vs FFTW. FFT22.11.2013, 00:20. Показов 4434. Ответов 16
Метки нет (Все метки)
Приветствую. Делаю программу, отображающую спектр wav-файла. Столкнулся с кое-каким непониманием: при вычислении БПФ в матлабе получаются одни значения, а в своей программе (использую библиотеку fftw) - другие. Проверял правильность работы функции из этой библиотеки, считая ДПФ небольшой последовательности в маткаде - все верно.
Значения амплитуд из wav-файла считываю правильно, сверялся с тем же матлабом (функция wavread). Может надо как-то нормализовывать результат БПФ? Гуглил, читал, что каждый коэффициент БПФ делят на N, но результат все равно не совпадает с матлабовским. Может кто знает почему так получается, или это несовпадение нормально?
0
|
22.11.2013, 00:20 | |
Ответы с готовыми решениями:
16
Не совпадают результаты Matlab и библиотека fftw Использование FFT в matlab Параллелизация FFT на Matlab Настройка блока FFT MatLab Как использовать оконное преобразование 2D FFT в MATLAB |
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
||||||
22.11.2013, 13:24 [ТС] | 3 | |||||
Мой код:
Кликните здесь для просмотра всего текста
Мой график: Код матлаб (брал отсюда) и график:
1
|
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
|
|
22.11.2013, 14:19 | 4 |
матлаб как раз использует внутри функции fft() библиотеку fftw, так что работают они одинаково. Ищите у себя ошибку. Коэффициенты должны совпадать без всяких делений на N.
1
|
22.11.2013, 14:31 | 5 | ||||||||||
1- " result[i] = sqrt(Re2 + Im2) / size;" приведите к единообразию вашу с матлабовской осью по амплитуде, чтобы и у вас были децибеллы, возьмите дополнительно десятичный логарифм от result-а и умножьте на 20
2- что-то с отображением значений по оси 0Y в вашей программе на графике, не видно сколько реально, везде 0.001 по оси 3- что за манипуляции с i? Она и без этого инкрементируется:
1
|
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
|
|
22.11.2013, 14:39 | 6 |
raxp, пункт 2 верно, возможно это единственная проблема. В матлабе он тоже считает амплитуды без перевода в децибелы. В 3 пункте freq = i+1 ничего дополнительно не инкрементируется вы поторопились, там просто смещается на единицу. Предлагаю для начала проверить работу функции на короткой последовательности например 4 числа и сравнить результаты(числа а не графики)
1
|
22.11.2013, 15:05 | 7 | |||||
1
|
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
|
|
22.11.2013, 15:27 | 8 |
действительно не нужен, возможно Selot для совместимости с матлабовской индексацией сместил на единицу отсчеты частоты. Это не инкремент. В децибелах действительно удобнее, мне тоже так привычнее.
1
|
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
22.11.2013, 15:28 [ТС] | 9 |
Проверял, все совпадает.
Убрал деление на N, вот график с дБ: И обычный: freq[i] = i + 1; изменил на freq[i] = i;
0
|
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
|
|
22.11.2013, 15:33 | 10 |
0
|
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
22.11.2013, 15:53 [ТС] | 11 |
Проблема осталась. Вот, смотрите...
Беру небольшую последовательность из 8 чисел: 40, 23, -2, 0, 0.2, 11, -6, 34. Загоняю их в матлаб и считаю бпф: Загоняю их в свою прогу и считаю бпф: Все круто, считает правильно. Теперь беру амплитуды из wav и загоняю в матлаб: А теперь в свою прогу: И даже близко не совпадает.
0
|
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
22.11.2013, 16:05 [ТС] | 13 |
Тут ограничение на размер тхт файлов стоит, поэтому пришлось в его архив:audio_data.rar
0
|
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
|
|||||||||||
22.11.2013, 16:54 | 14 | ||||||||||
для ваших данных код на матлабе:
1
|
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
22.11.2013, 17:42 [ТС] | 15 |
0
|
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
22.11.2013, 17:56 [ТС] | 16 |
Спасибо всем, товарищи. Теперь все работает! И графики 1 в 1 Проблема была с точностью считывании амплитуд из wav.
1
|
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
|
|||||||||||
22.11.2013, 18:25 | 17 | ||||||||||
1
|
22.11.2013, 18:25 | |
22.11.2013, 18:25 | |
Помогаю со студенческими работами здесь
17
Придумать как посчитать FFT([a1, a2, . . . , an]) за время O(n), при известном FFT([a0, a1, . . . , an−1]) FFTW 3 FFTW Работа с FFTW FFTW и iOS Подключение FFTW в Qt Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |