Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: БПФ в узкой полосе
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Fourier
Здравствуйте, уважаемые участники!
Известно, что максимально правдоподобной оценкой частоты однотонового сигнала является оценка вида F = argmax(P(F)), где P(F) - периодограмма сигнала.
Когда выборка сигнала X короткая (N - размер выборки), чтобы посчитать периодограмму приходится производить дополнение нулями до Nfft >> N, чтобы получить высокую точность.
Альтернативой этому может служить двухпроходной алгоритм:
1) Вычисление БПФ по исходным данным N FFT1(F) = FFT(X). Вычисление оценки F0 = argmax(FFT1(F)).
2) Уточнение частоты в полосе [F0 - dF, F0 + dF], где dF - частотный шаг исходного БПФ. Например, с помощью алгоритма Герцеля.
Однако этап 2 может оказаться весьма трудоемким.

Возникает 2 вопроса:
1) Существуют ли специальные алгоритмы БПФ, которые заточены под дополнение нулями (т.е. оптимизированы с учетом отсутствия необходимости проводить умножения в нулевой части сигнала, но с учетом большого числа базисных синусов и косинусов)
2) Существуют ли специальные алгоритмы БПФ предназначенные для вычисления спектральных отсчетов в ограниченной полосе, с возможностью изменения числа базисных функций.

Если можно, поделитесь ссылками или опытом.
Corner
Цитата(Fourier @ Nov 8 2015, 21:52) *
Здравствуйте, уважаемые участники!
Известно, что максимально правдоподобной оценкой частоты однотонового сигнала является оценка вида F = argmax(P(F)), где P(F) - периодограмма сигнала.
Когда выборка сигнала X короткая (N - размер выборки), чтобы посчитать периодограмму приходится производить дополнение нулями до Nfft >> N, чтобы получить высокую точность.
Альтернативой этому может служить двухпроходной алгоритм:
1) Вычисление БПФ по исходным данным N FFT1(F) = FFT(X). Вычисление оценки F0 = argmax(FFT1(F)).
2) Уточнение частоты в полосе [F0 - dF, F0 + dF], где dF - частотный шаг исходного БПФ. Например, с помощью алгоритма Герцеля.
Однако этап 2 может оказаться весьма трудоемким.

Возникает 2 вопроса:
1) Существуют ли специальные алгоритмы БПФ, которые заточены под дополнение нулями (т.е. оптимизированы с учетом отсутствия необходимости проводить умножения в нулевой части сигнала, но с учетом большого числа базисных синусов и косинусов)
2) Существуют ли специальные алгоритмы БПФ предназначенные для вычисления спектральных отсчетов в ограниченной полосе, с возможностью изменения числа базисных функций.

Если можно, поделитесь ссылками или опытом.

При некоторой полосе, относительно всего имеющегося спектра, становится выгодно заменить БПФ на обычное ДПФ или NCO с переносом на 0. Правда, если входная полоса шире октавы, желательно до ДПФ поставить фильтр и подавить гармоники, как вниз, так и вверх от исследуемой полосы. Это улучшит итоговый с/ш как по шуму, так и по спурам.
eugen_pcad_ru
Алгоритм Герцеля не подойдет?
one_eight_seven
БПФ вычисляет либо всю полосу полностью, либо не вычисляет ничего. Для части спектра могут быть выгодны другие алгоритмы ДПФ.
gridinp
Для практического применения наверное лучше всего библиотека FFTW, там процедура расчета спектра сама определяет, как считать БПФ или ДПФ в зависимости от длины и от процессора, Matlab её использует для fft()
stealth-coder
Надо понимать, что дополнение нулями во временнОй области это просто ИНТЕРПОЛЯЦИЯ в частотной, а не повышение точности в смысле увеличения количества информации, 100500 миллионов дополнительных нулей никакой информации не несут, т.к. сгенерированы искусственно, а не получены из источника.
gridinp
да, кстати для оценки именно монотонового сигнала, желательно кроме дополнения нулями наложить окно Ханна, оно по моему дает самое лучшее разрешение в спектре, ибо начало и конец сигнала обычно плохо стыкуются, за исключением когда генератор и АЦП синхронизированы и число периодов точно целое
Fourier
Всем спасибо за ответы!
eugen_pcad_ru
Цитата
Алгоритм Герцеля не подойдет?

Ну, наверное, можно и его использовать. Для начала, определив полосу сигнала
one_eight_seven
Цитата
БПФ вычисляет либо всю полосу полностью, либо не вычисляет ничего. Для части спектра могут быть выгодны другие алгоритмы ДПФ.

А какие? Я только Герцеля знаю. Ссылочками не поделитесь.
stealth-coder
Код
Надо понимать, что дополнение нулями во временной области это просто ИНТЕРПОЛЯЦИЯ в частотной, а не повышение точности в смысле увеличения количества информации, 100500 миллионов дополнительных нулей никакой информации не несут, т.к. сгенерированы искусственно, а не получены из источника.

Это понятно. Но насколько я понимаю, это самая эффективная интерполяция. Особенно для коротких сигналов.
Вот примерчик.
Точек в исходном сигнале, по моему или 16 или 32.
Истинная частота - 0,231.
На первом рисунке результат БПФ
На втором интерполяция кубическими сплайнами
На третьем - дополнением нулями.

Кубические сплайны сильно смещают оценку
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.