БПФ неверное значение?
Произвольное построение очень простого анализатора спектра звука.
Учитывая этот код Python:
http://rosettacode.org/wiki/Fast_Fourier_transform
Реализовано так:
import math
from cmath import exp, pi
def fft(x):
N = len(x)
if N <= 1: return x
even = fft(x[0::2])
odd = fft(x[1::2])
return ([even[k] + exp(-2j * pi * k / N) * odd[k] for k in xrange(N / 2)] +
[even[k] - exp(-2j * pi * k / N) * odd[k] for k in xrange(N / 2)])
#res = fft([1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0])
res = [math.sin(k) / 2.0 + 0.5 for k in xrange(64)] # positive sine wave
res = fft(res)
for k in xrange(64/2):
# get the amplitude...
sqr = math.sqrt(res[k].real * res[k].real + res[k].imag * res[k].imag)
if sqr > 0:
print 20 * math.log10(sqr) # ...in decibels
else:
print "-INF"
Я получаю эти результаты:
30.1160980385
-22.9398603241
-18.5295301528
-15.0005952198
-11.9809319241
-9.15035811436
-6.26269080991
-3.05038111824
0.930742121289
6.85461898041
23.4890109499 <-- PEAK
11.1462405429
4.62796511517
1.22261338459
-1.03611868864
-2.69639200998
-3.98905968693
-5.03263380282
-5.89570135908
-6.62130526828
-7.23808293566
-7.76594168565
-8.21919399668
-8.60840088318
-8.94151058446
-9.22459042752
-9.46231245749
-9.6582838436
-9.81527579404
-9.93538377539
-10.0201395611
-10.070588143
Которые довольно хорошо. У меня пик 23 дБ предположительно на частоте входной синусоиды и все вроде нормально.
Единственное, что является первым значением: 30.1160980385
? Это какой-то чрезвычайно громкий бас? Или, скорее, недостаток в алгоритме. В этом случае, как мне это исправить.
Последний вопрос. Это нормально для FFT иметь отрицательные значения в качестве входных данных? В приведенном выше примере я использовал синусоидальную волну, которая всегда положительна в диапазоне [0,1]. Должен ли я все испортить, если я хочу передать значения в диапазоне [-1,1]?
РЕДАКТИРОВАТЬ:
Я удалил редактирование, потому что это было не по теме. Вы можете прочитать, что это было здесь:
БПФ неожиданный сдвиг частоты после применения оконной функции
1 ответ
Очевидно, у вас большой компонент постоянного тока из-за того, что ваша синусоида имеет смещение +0,5. Если ваша синусоида имеет нулевое среднее значение (т. Е. Диапазон, скажем, +/- 0,5 или +/- 1,0), тогда ваш спектр должен выглядеть лучше на конце DC (0 Гц).
Также обратите внимание, что вы не использовали оконную функцию до БПФ, поэтому вы получите спектральную утечку ("размывание" спектра), и это может усугубить влияние любого компонента постоянного тока.