Является ли действительным увеличение амплитуды (и предположительно качества БПФ) путем простого масштабирования данных?

10

Я использую версию "KISS FFT" Марка Боргердинга. Он принимает массив 16-разрядных входных значений с фиксированной точкой и создает 32-разрядный массив результатов с плавающей запятой.

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

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

(Обратите внимание, что этот подход означает, что в данных гораздо больше "грубости" / детализации, и, в частности, шума низкого уровня, который обычно присутствует, нет. Мне почти интересно, было бы разумно вводить некоторый шум низкого уровня, чтобы заменить нулевые значения на входе.)

Даниэль Р Хикс
источник
«Мне почти интересно, было бы разумно вводить какой-то шум низкого уровня, чтобы заменить нулевые значения на входе». = en.wikipedia.org/wiki/Dither
эндолит

Ответы:

7

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

Однако для некоторых комбинаций алгоритма и схемы округления, когда величина входного сигнала очень мала, можно получить то, что вы наблюдали: большое количество нулевых выходов. По сути, где-то в последовательности операций промежуточные результаты становятся достаточно маленькими, чтобы не нарушать порог, необходимый для квантования до ненулевого уровня. Затем значение округляется до нуля, что часто может распространяться вперед на выход. В результате, как вы заметили, алгоритм генерирует много выходных нулей.

Так что вы можете обойти это путем масштабирования данных? Иногда (очень мало техник, которые работают постоянно!). Если ваш входной сигнал ограничен по величине значением ниже полной шкалы числового формата (16-разрядные целые числа со знаком работают от -32768 до +32767), то вы можете масштабировать входной сигнал до более полного использования диапазона, доступного для Это. Это может помочь смягчить последствия ошибки округления, поскольку величина любой ошибки округления становится меньше по сравнению с сигналом, представляющим интерес. Таким образом, в случае, когда все ваши выходные данные округляются до нуля внутри алгоритма, это может помочь.

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

Джейсон Р
источник
Я использую динамическую технику для масштабирования, которая, кажется, работает очень хорошо. И, как повезет, экстремальные переходные процессы в любом случае рассматриваются как шум и ограничиваются, поэтому случайное ограничение не должно быть проблемой. Считаете ли вы правильным «накинуть» вывод, разделив его на масштабный коэффициент?
Даниэль Р Хикс
1

Самый простой и надежный способ справиться с этим - преобразовать данные в число с плавающей запятой ДО FFT и использовать FFT с плавающей запятой. Единственным недостатком этого подхода является то, что вы можете использовать больше процессора и памяти. Так как ваш вывод в любом случае имеет плавающую точку, практическая разница, вероятно, невелика.

Hilmar
источник
Мне передали этот проект с текущим алгоритмом БПФ, и я неохотно отказываюсь от него на данном этапе. И все это происходит по телефону в режиме реального времени, поэтому производительность, безусловно, является проблемой.
Даниэль Р Хикс
Понял. Вы знаете, является ли внутреннее БПФ фиксированной или плавающей точкой? Если это исправлено, вам нужно беспокоиться об отсечении, переполнении и потере
Хильмар
Документация и комментарии исключительны в ее отсутствии, но я вижу много целых в коде и очень немногие плавающие и двойные числа. Похоже, что он включает в себя грубую платформу #ifdef для переключения с 16-битной системы на 32-битную или с плавающей запятой, но эта платформа, очевидно, давно отключена.
Даниэль Р Хикс
IPhone (ARM + NEON CPU) может выполнять FFT с плавающей запятой быстрее (через платформу Accelerate), чем целочисленное FFT в C.
hotpaw2