Волновой файл: 44100 Гц, 16 бит, двухканальный.
Я использую БПФ для вычисления амплитуды на каждом частотном выходе. Но я не знаю, как масштабировать его, чтобы рисовать (в реальном времени) спектр.
Кто-нибудь может мне помочь?
Волновой файл: 44100 Гц, 16 бит, двухканальный.
Я использую БПФ для вычисления амплитуды на каждом частотном выходе. Но я не знаю, как масштабировать его, чтобы рисовать (в реальном времени) спектр.
Кто-нибудь может мне помочь?
Что ж; есть несколько способов сделать это...
например: если вам нужна шкала дБ, для каждой воображаемой выборки вычислите
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.
масштаб y = мин (макс (масштаб y, 5), 200)
это было давно, так что я извиняюсь, если есть какие-либо математические ошибки. :)
Различные реализации БПФ имеют разные масштабные коэффициенты, которые могут отличаться на N, 1/N или 1/sqrt(N), где N — длина БПФ. По крайней мере, для одного вида целочисленного входного FFT со знаком максимальный масштаб составляет около sqrt (2) * N * 2 ^ (b - 1), где b - количество битов слева от десятичной точки (16 в вашем случае, может быть 17, если вы суммируете каналы в более крупный тип данных перед БПФ).