Почему я должен обнулять сигнал перед выполнением преобразования Фурье?


77

В ответе на предыдущий вопрос было указано, что следует

обнуляйте входные сигналы (добавьте нули в конец, чтобы хотя бы половина волны была «пустой»)

В чем причина этого?


Это зависит от того, что вы делаете. Это мог быть комментарий к моему ответу. Я добавил к этому какое-то объяснение.
Эндолит

@endolith: Первоначально я думал поместить это как комментарий, но я думаю, что вопрос может представлять общий интерес, и что было бы жаль, если бы хороший ответ на него был где-то похоронен в комментариях. Если вы не согласны, я удалю этот вопрос.
Йонас

9
Ну, это очень общий вопрос. Вы можете обнулить, чтобы сделать что-то с степенью 2, вы можете обнулить, чтобы сделать круговое преобразование похожим на некруговое, вы можете сделать это для повторной выборки сигнала, изменения разрешения по частоте и т. Д. И т. Д.
endolith

Также связано: dsp.stackexchange.com/questions/331/…
finnw

Ответы:


82

Нулевое заполнение позволяет использовать более длинное БПФ, что приведет к более длинному вектору результата БПФ.

Более длинный результат FFT имеет больше частотных бинов, которые расположены ближе друг к другу по частоте. Но они, по сути, будут обеспечивать тот же результат, что и высококачественная интерполяция Sinc более короткого БПФ, не дополненного нулями, исходных данных.

Это может привести к более гладкому виду спектра при построении без дальнейшей интерполяции.

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

Но, по сути, заполнение нулями перед DFT / FFT является вычислительно эффективным методом интерполяции большого количества точек.

Заполнение нулями для взаимной корреляции, автокорреляции или сверточной фильтрации используется, чтобы не смешивать результаты свертки (из-за круговой свертки). Полный результат линейной свертки длиннее любого из двух входных векторов. Если вы не предоставите место, чтобы положить конец этому более длинному результату свертки, быстрая свертка FFT просто смешает его и сведет на нет желаемый результат. Нулевое заполнение обеспечивает кучу нулей, в которые можно смешивать более длинный результат. И гораздо проще распутать то, что было смешано / суммировано с вектором нулей.


12
Последний абзац является ключевым ответом на первоначальный вопрос, хотя я думаю, что его можно сформулировать более четко. Заполнение нулями в контексте корреляции или свертки может быть сделано, чтобы гарантировать, что реализация процесса в частотной области дает линейную, а не круговую свертку / корреляцию. Тем не менее, это не является обязательным требованием, если вы готовы выполнить некоторую бухгалтерскую работу на стороне, как в алгоритмах наложения-сохранения и наложения-добавления.
Джейсон Р

4
@ Джейсон Р: На самом деле, они оба круговой свертки. Обычное (без обрезки) БПФ выполняет все умножения и добавляет для обтекания часть результата. Просто в достаточно заполненном нулями случае все эти умножения и сложения имеют нулевое значение, поэтому никому нет дела до того, что ничего не вычисляется и не оборачивается вокруг круга.
hotpaw2

9
На самом деле; умножение ДПФ на два сигнала всегда реализует круговую свертку. Я должен был сформулировать это по-другому: вы заполняете нули в конце одного сигнала, чтобы гарантировать, что результат, полученный их циклическим свертыванием, совпадает с тем, что вы получаете, если их линейно сворачивать (при условии, что вы хотите получить линейную свертку, обычно бывает).
Джейсон Р

27

Есть несколько вещей, которые необходимо рассмотреть, прежде чем вы решите обнулить сигнал во временной области. Вам, возможно, не нужно обнулять сигнал вообще!

1) Удлините данные во временной области (не добавляя ноль), чтобы получить лучшее разрешение в частотной области.

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

3) При работе с точками FFT (в предыдущей точке), убедитесь, что ваши частотные точки окажутся там, где вы хотите. Интервал между точками равен , где - частота дискретизации, а - количество точек FFT.fs/NfsN

Есть несколько хороших рисунков, иллюстрирующих эти моменты на http://www.bitweenie.com/listings/fft-zero-padding/

Еще одна вещь, которую стоит упомянуть: если вы обнуляете сигнал во временной области и хотите использовать функцию управления окнами, убедитесь, что вы заполняете сигнал перед нулевым заполнением. Если вы примените оконную функцию после заполнения нулями, вы не достигнете того, что должно делать окно. Более конкретно, у вас все равно будет резкий переход от сигнала к нулю вместо плавного перехода к нулю.


8

В общем случае заполнение нулями до DFT эквивалентно интерполяции или более частой выборке в преобразованной области.

Вот быстрая визуализация того, как работает противоположность. Если вы сэмплируете ограниченный по времени сигнал во времени с более высокой скоростью, вы получите более «сжатый» спектр, то есть спектр с большим количеством нулей на обоих концах. Другими словами, вы можете получить больше выборок во времени, просто заполнив нулями частоту после DFT-обработки, а затем IDFT-обработав результат с нулевым заполнением.

Тот же эффект сохраняется в обратном порядке, когда заполнение нулями происходит во времени. Это все потому, что идеальное восстановление сигнала возможно при условии, что сигнал ограничен полосой частот и дискретизирован по крайней мере с частотой Найквиста.

Термин «разрешение» зависит от того, как вы его определяете. Для меня это означает, насколько хорошо две статистические точки наблюдения могут быть достоверно (статистически) различимы. В этом случае разрешение фактически зависит от размера ДПФ из-за спектральной утечки. То есть, чем меньше размер окна, тем больше размытость или размытость преобразованного сигнала, и наоборот. Это отличается от того, как часто вы проводите выборку, или от того, что я называю «определением». Например, вы можете получить очень размытое изображение с высокой частотой (высокая четкость), но вы все равно не сможете получить больше информации, чем с низкой частотой. Итак, в итоге, заполнение нулями вообще не улучшает разрешение, так как вы не получаете больше информации, чем раньше.


6

Если кто-то заинтересован в спектре функции управления окнами, используемой для выделения выборки во временной области, то заполнение нулями БУДЕТ увеличить разрешение по частоте функции управления окнами.

Если временной сигнал равен , где - функция управления окнами, то общий спектр равен , где обозначает свертку. x(t)w(t)w(t)X(f)W(f)

Если ваша оконная функция представляет собой простой прямоугольник (извлечение некоторого набора значений из . Тогда является функцией синхронизации. Так, например, если Nfft совпадает с шириной вашего прямоугольника, и у вас была синусоида точно на одной из частот бина, тогда сэмплы функции синхронизации, которые могли бы появиться в центре этого бина, попали точно в непиковые пересечения нуля, и вы не видите форму синхронизации в спектр на всех. Если вы теперь ноль дополнить ваши данные, поступающие в БПФx(t)X(f)вы увидите несколько образцов в местах, отличных от пика и пересечения нуля, раскрывая форму функции синхронизации в результирующем спектре. Так что толку от нуля? Он, безусловно, имеет образовательное значение для выявления природы дискретного преобразования оконных сигналов, что является обычным случаем. В практическом смысле это может быть полезно в любом случае, когда вас интересует спектральная форма изолированной огибающей, движущейся на несущей волне.


4

Причины могут быть разными в зависимости от любых процессов, выполняемых до и после преобразования Фурье. Наиболее распространенной причиной является достижение большего разрешения по частоте в любом преобразовании. То есть, чем больше число выборок, используемых в преобразовании, тем уже ширина полосы в результирующем спектре мощности. Помните: binwidth = sample_frequency / transform_size (часто называемый размером окна). Исходя из этого, вы можете представить, что по мере увеличения размера преобразования ширина полосы уменьшается (= лучшее разрешение по частоте). Нулевое заполнение - это способ увеличения размера преобразования без введения новой информации в сигнал.

Так почему бы просто не взять большее преобразование без заполнения нулями? Разве это не достигнет того же эффекта? Хороший вопрос. Во многих случаях вы можете захотеть проанализировать поток данных во временной области, для которых вы можете использовать кратковременное преобразование Фурье (stft). Это включает в себя преобразование каждые N выборок в соответствии с временным разрешением, которое вам необходимо для характеристики изменений в частотном спектре. Здесь кроется проблема. Слишком большое окно, и вы потеряете разрешение по времени, слишком маленькое окно, и вы потеряете разрешение по частоте. Тогда решение состоит в том, чтобы взять небольшие окна во временной области, обеспечивающие хорошее разрешение по времени, а затем обнулить их, чтобы получить хорошее разрешение по частоте. Надеюсь, это полезно для вас

Обновление
я не объяснил это хорошо. Я должен был уточнить это лучше. Обращаясь к оконному преобразованию, на самом деле вы не получаете «фактического» более высокого разрешения по частоте, но для целей визуализации (считывание спектра мощности глазом) оно может обеспечить более четкие результаты. Используя критическую частоту дискретизации, каждый боковой лепесток занимает одну ячейку, что в зависимости от метода построения графика может вводить в заблуждение. Нулевое заполнение обеспечивает интерполированный частотный спектр, который может быть более показательным. Кроме того, если вы используете простой метод выбора пиков для оценки частоты, эффект спектральной интерполяции заполнения нулями даст вам спектральную выборку ближе к истинному пику основного лепестка. Эта ссылка содержит несколько полезных диаграмм: http://www.dsprelated.com/dspbooks/sasp/Practical_Zero_Padding.html


9
Этот ответ не верен. Нулевое заполнение вообще не улучшает разрешение по частоте; он просто интерполирует между выходами меньшего преобразования. Вы можете думать о заполнении нулями как о добавлении большего количества частотных бинов, имеющих ту же полосу пропускания, что и с меньшим преобразованием; поэтому с точки зрения банка фильтров их полосы пропускания перекрываются.
Джейсон Р

1
Если это помогает понять: вы также можете сделать обратное: взять БПФ сигнала, затем добавить нулевое значение результата и обратное БПФ. Это будет иметь эффект интерполяции исходного сигнала. Но, конечно, сигнал будет таким же, с той же пропускной способностью Найквиста. Интерполяция не даст вам более высокой частоты информации, чем была изначально.
Эндолит

1
@ Джейсон Р - Вы правы, мой ответ вводил в заблуждение, я попытался уточнить выше исходный пост. Я не должен был утверждать, что заполнение нулями увеличивает разрешение по частоте.
Дэн Барри

2

Я не видел их упомянутых в предыдущих хороших ответах, поэтому добавлю следующие дополнительные важные причины для заполнения нулями:

Алгоритмы Radix-2 более эффективны, поэтому добавление нуля к следующей степени 2 (или мощности 4 в некоторых случаях для radix-4) или, что еще более важно, избегание любых больших простых факторов, может улучшить производительность в реальном времени. Также при использовании БПФ для анализа часто выполняется заполнение нулями для вычисления выборок ДПФ, например, для определения частотной характеристики КИХ: сравните fft ([1 1 1 1]) с fft ([1 1 1 1], 512), который идентичен freqz ([1 1 1 1]).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.