Как масштабировать FFT-вывод волнового файла? - PullRequest
3 голосов
/ 12 июля 2011

Волновой файл: 44100 Гц, 16 бит, двухканальный.

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

Кто-нибудь может мне помочь?

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

хорошо; Есть несколько способов сделать это ...

Например,

: если вы хотите использовать шкалу в дБ, для каждой воображаемой выборки вычислите

ymag = (x.real ^ 2 + x.imag ^ 2)

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

поиск в результирующих значениях минимальных и максимальных значений и их сохранение. если ваше минимальное значение равно нулю, выберите какое-то очень маленькое значение, которое будет вашим минимальным. (0.000001 или что-то). затем установите минимальное значение дБ в виде mindB = 10 * log10 (минимум).

Теперь первое возвращенное значение (sample [0]) будет вашим смещением постоянного тока, которое вы, вероятно, захотите установить равным нулю.

затем для каждого образца вычислите: ydB = 10 * log10 (ymag / максимум).

это должно дать вам массив, который представляет дБ от максимума каждого бина семпла. Вы можете масштабировать это к тому, что вам нужно; если область вашего графика изменяется от y = 5 до y = 200, вы можете использовать что-то вроде:

yscaled = ((ydB / -mindB) * (200 - 5) + 200)

я бы также гарантировал, что масштабированное значение помещается в границы в случае ошибки округления FP.

yscaled = min (max (yscaled, 5), 200)

Прошло много времени с тех пор, как я это сделал, поэтому я прошу прощения, если есть какие-либо математические ошибки. :)

1 голос
/ 13 июля 2011

Различные реализации FFT имеют разные масштабные коэффициенты, возможно, различающиеся на N, 1 / N или 1 / sqrt (N), где N - длина FFT. По крайней мере для одного вида целочисленного входного БПФ со знаком, максимальный масштаб составляет около sqrt (2) * N * 2 ^ (b - 1), где b - это число бит слева от десятичной точки (16 в вашем случае, возможно, 17, если вы суммируете каналы в больший тип данных до FFT).

...