Пожалуйста, предположим следующее:
- Частота основного сигнала была оценена с использованием БПФ и некоторых методов оценки частоты и находится между двумя центрами бинов
- Частота дискретизации фиксирована
- Вычислительные усилия не проблема
Зная частоту, каков наиболее точный способ оценить соответствующее пиковое значение фундаментальных сигналов?
Одним из способов может быть обнуление сигнала времени для увеличения разрешения БПФ, чтобы центр бина был ближе к расчетной частоте. В этом сценарии один момент, в котором я не уверен, заключается в том, могу ли я заполнять нулями столько, сколько я хочу, или в этом есть некоторые недостатки. Другой - какой центр ячеек я должен выбрать после заполнения нулями как тот, из которого я получаю пиковое значение (потому что каждый может точно не достичь интересующей частоты, даже после заполнения нулями).
Однако мне также интересно, есть ли другой метод, который может дать лучшие результаты, например, оценщик, который использует пиковые значения окружающих двух центров бинов для оценки пикового значения на интересующей частоте.
imax
пик FFT) даст вам точные результатыОтветы:
Первый алгоритм, который приходит на ум, - это алгоритм Гёртцела . Этот алгоритм обычно предполагает, что представляющая интерес частота является целым кратным основной частоты. Тем не менее, эта статья применяет (обобщенный) алгоритм к интересующему вас случаю.
Другая проблема заключается в том, что модель сигнала неверна. Это использует
2*%pi*(1:siglen)*(Fc/siglen)
. Это должно использовать2*%pi*(0:siglen-1)*(Fc/siglen)
для фазы, чтобы выйти правильно.Я также думаю, что есть проблема с
Fc=21.3
очень низкой частотой . Низкочастотные реальные значения имеют тенденцию проявлять смещение, когда речь идет о проблемах оценки фазы / частоты.Я также попытался выполнить грубый сеточный поиск для оценки фазы, и он дает тот же ответ, что и алгоритм Гёртцеля.
Ниже приведен график, который показывает смещение в обеих оценках (Гертцель: синий, Грубый: красный) для двух разных частот:
Fc=21.3
(сплошная) иFc=210.3
(пунктирная). Как видите, уклон для более высокой частоты намного меньше.График оси представляет собой начальную фазу, изменяющуюся от 0 до .2 πИкс 2 π
источник
Если вы хотите использовать несколько соседних бин FFT, а не только 2, то оконная интерполяция Sinc между результатами комплексного бина может дать очень точную оценку в зависимости от ширины окна.
Оконная интерполяция Sinc обычно встречается в высококачественных аудио апсэмплерах, поэтому статьи по этому вопросу будут иметь подходящие формулы интерполяции с анализом ошибок.
источник
Если вы используете Flanagan [1], он вычисляется из разности фаз последовательных фазовых спектров Δϕ (мгновенная частота), и если вы восстанавливаете величину, используя правильный коэффициент (Instantaneous Magnitude) [2], используйте нормализованную функцию sinc: И в конце используйте параболическую интерполяцию вокруг пиковой величины, вы можете получить потрясающие результаты, сегодня я считаю, что это лучший способ, я его использовал, и результаты всегда очень солидно :-)
[1] Дж. Л. Фланаган и Р. М. Голден, «Фазовый вокодер», Bell Systems Technical Journal, vol. 45, с. 1493–1509, 1966.
[2] K. Dressler, «Синусоидальное извлечение с использованием эффективной реализации БПФ с множественным разрешением», в Proc. 9th Int. Conf. о цифровых аудиоэффектах (DAFx-06), Монреаль, Канада, сентябрь 2006 г., стр. 247–252.
источник
Один метод состоит в том, чтобы найти максимум и подогнать к нему параболу, а затем использовать максимум параболы в качестве оценки частоты и величины. Вы можете прочитать все о здесь: https://ccrma.stanford.edu/~jos/sasp/Sinusoidal_Peak_Interpolation.html
источник
У меня было много трудностей с этой проблемой пару лет назад.
Я разместил этот вопрос:
/programming/4633203/extracting-precise-frequencies-from-fft-bins-using-phase-change-between-frames
Я закончил вычисления с нуля и отправил ответ на свой вопрос.
Я удивлен, что мне не удалось найти подобную экспозицию в Интернете.
Я опубликую ответ снова здесь; Обратите внимание, что код разработан для сценария, в котором я перекрываю окно FFT в 4 раза.
π
Эта головоломка требует два ключа, чтобы разблокировать ее.
Первый ключ заключается в том, чтобы понять, как перекрытие окна FFT приводит к повороту на этапе bin.
Второй ключ взят из графика 3.3 и 3.4 здесь (спасибо Стефану Бернзее за разрешение скопировать фотографии здесь).
График 3.3:
График 3.4:
Код:
источник
Этот код Python даст вам очень точный результат (я использовал его для большого количества музыкальных нот и получил ошибки менее 0,01% полутона) с параболической интерполяцией (метод, успешно используемый McAulay Quatieri, Serra и т. Д. В гармонике + невязка методы разделения)
источник
Частоты, с которыми вы работаете (частота дискретизации 21,3 Гц при 8 кГц) очень низкие. Поскольку это действительные сигналы, они будут демонстрировать смещение при оценке фазы для ** любой ** частоты.
На этом рисунке показан график зависимости смещения (
phase_est - phase_orig
) дляFc = 210.3;
(красным) от смещения дляFc = 21.3;
. Как видите, смещение для21.3
дела гораздо значительнее .Другой вариант - уменьшить частоту дискретизации. Зеленая кривая показывает смещение
Fs = 800
вместо8000
.источник
goertzel = atan(imag(y(2)),real(y(2)))*180/%pi + 90;
. :-) Буду копать еще немного. Смотреть это пространство.p
с ,p2 = (abs(y(3)) - abs(y(1)))/(2*(2*abs(y(2)) - abs(y(3)) - abs(y(1)))); phase2 = y0 - 0.25*(ym1-yp1)*p2;
то вы получите гораздо лучшие ответы --- дажеFc=210
. Я совсем не уверен, что текущая версияp
даст вам что-нибудь разумное. Формула интерполяции предназначена для интерполяции амплитуды параболы, ноp
интерполирует фазу, которая просто ... странна.p = (yp1 - ym1)/(2*(2*y0 - yp1 - ym1))
) будет неправильным в некоторых случаях, если вы используете ФАЗЫ вместо амплитуд. Это связано с тем, что фазы могут пересекать границу +/- 180 градусов. Все, что нужно, чтобы исправить это для фазы, - это изменить эту строку на мойp2
расчет выше.