2015-04-01 2 views
1

Я видел похожие вопросы, о которых я спрашивал, но я просто не могу понять, что это правильно. Надеюсь, вы догадываетесь, может помочь, если я неправильно понимаю что-то концептуально или кодовое. В основном я делаю чириканье от 1 кГц до 10 кГц с длительностью 1 с с частотой 48 кГц. Я просто хочу построить частоту spetrum/fft этого chirp с правой амплитудой. Код:fft амплитуда chirp в python

from scipy.fftpack import fft 

N = 48000 
fs = 48000.0 
sine_list_x = [] 
K = (10000.0 - 1000.0)/(48000.0) 
for x in range(N): 
    sine_list_x.append(sin(2*pi*(1000.0*(x/48000.0)+(K/2.0)*(x**2)/(48000.0)))) 

xf = np.linspace(0.0, fs/2.0, N/2) 
yf = fft(sine_list_x) 
yf = yf/sqrt(N) 
#yf = yf/N 

fig3 = pl.figure() 
ax3 = fig3.add_subplot(111) 
ax3.plot(xf, abs(yf[0:N/2])) 

сюжет из приведенного выше кода я показано здесь enter image description here

Я знаю, что функция FFT не нормализуется, но я вроде получить противоречивые данные от подобных вопросов, которые говорят так нормализуют путем sqrt (N), N и другие вещи.

То, что я ожидал увидеть на графике, если бы я нормализовался правильно, было амплитудой 1, поскольку это амплитуда чирпа. Это неправильное предположение? Или я просто делаю что-то неправильно в нормализации?

ответ

2

В во временной области и для развертки с медленно изменяющейся частотой, сумма квадратов выборок целого числа циклов (или достаточно большого числа циклов) может быть аппроксимирована

 0.5*N*At*At 

где N - количество выборок, а At - амплитуда развертки. Для ваших данных параметров (N=48000, At=1) это будет 24000, который приближается к точному значению ~ 23999.9986331, предоставленному в @tom10's answer.

С другой стороны в частотной области (если смотреть на графике спектра частот), полный спектр может быть аппроксимирована 2 коробки (как можно было бы ожидать от линейной частотной развертки):

  • один от 1000 до 10000, который вы показываете на своем графике
  • , а другой от 38000 до 47000, который возникает из эрмитовой симметрии частотного спектра реальных сигналов.

Сумма квадратов (в частотной области) образцов в этом случае может затем быть аппроксимирована

 2*((10000-1000)+(47000-38000))*Af*Af == 18000*Af*Af 

Теперь Parseval's theorem for the disrete Fourier transform гласит, что:

\sum_{n=0}^{N-1} \left|x[n]\right|^2 = \frac{1}{N} \sum_{n=0}^{N-1} \left|X[k]\right|^2

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

 24000 = 18000*Af*Af 

Таким образом, Af должен быть приблизительно равен sqrt(24000/18000) = 1.1547..., что согласуется с графиком, который вы построили.

2

То, что вы ожидаете от сохранения пары, это полная мощность, которой она является. Так, если после нормализации по sqrt(N), вы делаете:

print sum(abs(yf*yf)), sum(np.array(sine_list_x)**2) 

вы получите

23999.9986331 23999.9986331 

, который на это должно быть.

Поскольку вы не смотрите на чистую синусоидальную волну, будет сложно сравнивать амплитуды, но сила всегда должна работать.

Смежные вопросы