Я использую версию "KISS FFT" Марка Боргердинга. Он принимает массив 16-разрядных входных значений с фиксированной точкой и создает 32-разрядный массив результатов с плавающей запятой.
Я обнаружил, что если входные амплитуды малы, многие из значений результата с плавающей запятой выходят равными нулю, но если я просто масштабирую входные данные (скажем, с помощью коэффициента 16), то меньшее количество выходных значений будет равно нулю, и, следовательно, выходные данные содержат Подробнее. (Не то чтобы это имеет большое значение для моих целей, но для согласованности я делю полученные значения с плавающей точкой на тот же коэффициент масштабирования.)
В любом случае, это похоже на работу с точки зрения получения результата, когда раньше я только что получил буфер практически всех нулей, но мне интересно, есть ли какая-то причина, по которой это может быть неверным подходом.
(Обратите внимание, что этот подход означает, что в данных гораздо больше "грубости" / детализации, и, в частности, шума низкого уровня, который обычно присутствует, нет. Мне почти интересно, было бы разумно вводить некоторый шум низкого уровня, чтобы заменить нулевые значения на входе.)
Ответы:
Это может быть правильным подходом. Вы наблюдаете очень практическую проблему, которая часто возникает при использовании арифметики с фиксированной точкой (т. Е. Целочисленной) (хотя это может происходить и с плавающей точкой). Если числовой формат, который вы используете для выполнения вычислений, не обладает достаточной точностью для выражения полного диапазона значений, которые могут возникнуть из ваших вычислений, требуется некоторая форма округления (например, усечение, округление до ближайшего и т. Д. на). Это часто моделируется как аддитивная ошибка квантования вашего сигнала.
Однако для некоторых комбинаций алгоритма и схемы округления, когда величина входного сигнала очень мала, можно получить то, что вы наблюдали: большое количество нулевых выходов. По сути, где-то в последовательности операций промежуточные результаты становятся достаточно маленькими, чтобы не нарушать порог, необходимый для квантования до ненулевого уровня. Затем значение округляется до нуля, что часто может распространяться вперед на выход. В результате, как вы заметили, алгоритм генерирует много выходных нулей.
Так что вы можете обойти это путем масштабирования данных? Иногда (очень мало техник, которые работают постоянно!). Если ваш входной сигнал ограничен по величине значением ниже полной шкалы числового формата (16-разрядные целые числа со знаком работают от -32768 до +32767), то вы можете масштабировать входной сигнал до более полного использования диапазона, доступного для Это. Это может помочь смягчить последствия ошибки округления, поскольку величина любой ошибки округления становится меньше по сравнению с сигналом, представляющим интерес. Таким образом, в случае, когда все ваши выходные данные округляются до нуля внутри алгоритма, это может помочь.
Когда такая техника может навредить вам? В зависимости от структуры расчетов алгоритма, увеличение входного сигнала может привести к переполнению чисел. Кроме того, если сигнал содержит фоновый шум или помехи, которые больше по величине, чем ошибка округления алгоритма, то качество того, что вы получаете на выходе, будет обычно ограничено средой, а не ошибкой, вносимой в вычисления.
источник
Самый простой и надежный способ справиться с этим - преобразовать данные в число с плавающей запятой ДО FFT и использовать FFT с плавающей запятой. Единственным недостатком этого подхода является то, что вы можете использовать больше процессора и памяти. Так как ваш вывод в любом случае имеет плавающую точку, практическая разница, вероятно, невелика.
источник