2015-04-25 3 views
1

Я создал класс/объект FFT, который принимает сигнал, хранящийся в 2D-массиве, и производит последующий БПФ его ввода, прежде чем печатать его на графике matplotlib.DC Term in Python FFT - Амплитуда константного термина

После большого чтения я ценю, что из-за окон, необходимость иметь идеально 2^x число точек и целое число циклов в наборе данных, что амплитуда пиков никогда не будет 100% точная (но будет примерно одинаковой).

Однако, когда я добавляю смещение постоянного тока к сигналу, по какой-то причине частота 0 Гц имеет пик, который всегда точно удваивает фактическое смещение постоянного/постоянного тока! Например, если я добавлю 2 к синусоидальной волне x Гц, я получаю пик в x Гц на БПФ, а пик 4 при 0.

Почему это - и могу ли я исправить это?

Спасибо!

код я использую ниже:

import numpy as np 
import matplotlib.pyplot as plt 

class FFT: 
    def __init__(self, time, signal, buff=1, scaling=2, centre=False): 
     self.signal = signal 
     self.buff = buff 
     self.time = time 
     self.scaling = scaling 
     self.centre = centre 
     if (centre): 
      self.scaling = 1 
    def fft(self): 
     self.Y = np.fft.fft(self.signal, self.buff * len(self.signal)) # Do fft on signal and store 
     if (self.centre is True): 
      self.Y = np.fft.fftshift(self.Y) # centre 0 frequency in centre 
     self.__graph__() 
    def __graph__(self): 
     self.N = len(self.Y)/self.scaling # get FFT length (halved to avoid reflection) 
     print (self.N) 
     self.fa = 1/(self.time[1] - self.time[0]) # get time interval & sampling frequency of FFT 
     if (self.centre is True): 
     self.t_axis = np.linspace(-self.fa/2 * self.scaling, self.fa/2 * self.scaling, self.N, endpoint=True) # create x axis vector from 0 to nyquist freq. (fa/2) with N values 
     else: 
      self.t_axis = np.linspace(0, self.fa/self.scaling, self.N, endpoint=True) # create x axis vector from 0 to nyquist freq. (fa/2) with N values 
    def show(self, absolute=True): 

     if absolute: 
      plt.plot(self.t_axis, ((2.0) * self.buff/(self.N * (self.scaling))) * np.abs(self.Y[0:self.N])) 
     else: 
      plt.plot(self.t_axis, ((2.0) * self.buff/(self.Ns * (self.scaling))) * self.Y[0:self.N]) # multiply y axis by 2/N to get actual values 
     plt.grid() 
     plt.show() 

def sineExample(start=0, dur=128, samples=16384):  
    t = np.linspace(start, dur + start, samples, True) 
    print(t) 
    f = 10.0 # Frequency in Hz 
    A = 10.0 # Amplitude in Unit 
    retarr = np.zeros(len(t))  
    retarr = np.column_stack((t, retarr)) 
    for row in range(len(retarr)): 
     retarr[row][1] = A * np.sin(2 * np.pi * f * retarr[row][0]) + 2 # Signal 
    print(retarr) 
    return retarr 

hTArray = sineExample() 
# plt.plot(hTArray[:,0], hTArray[:,1]) 
# plt.grid() 
# plt.show() 

myFFT = FFT(hTArray[:, 0], hTArray[:, 1], scaling=2,centre=False) 
myFFT.fft() 
myFFT.show() 
+0

Что случилось с просто выполнением 'np.fft.fft (hTArray [:, 1])' для вашего сигнала? Я бы сказал, что ваш фактор '((2.0) * self.buff/(self.N * (self.scaling)))' должен быть неправильным, если вы не получаете правильную амплитуду компонента постоянного тока. – rth

+0

Фактор влияет на все термины одинаково - и все же это только член DC/0 Гц, который последовательно удваивает его истинное значение. – davidhood2

ответ

1

На самом деле, все наоборот. Все остальные частоты в полном комплексном FFT результате строго вещественных данных разбиты на 2 результирующие ячейки и зеркально отражены как комплексно сопряженные, таким образом, половина чистой амплитуды синусоидов при масштабировании на 1/N, за исключением компонента постоянного тока и косинусного компонента N/2, которые не делятся на 2 результата FFT и, следовательно, не уменьшаются вдвое.

+0

Как я могу исправить эту ошибку? Использует ли python rfft эту проблему? Благодаря! – davidhood2

+1

Разделите все свои результаты на 2. Чем удвоить зеркальные результаты, добавив две комплексные сопряженные половины назад вместе (так же, как умножение на 2). Компонент DC не зеркалируется (или некоторые говорят, что он зеркалирован, но уже добавлен к себе), поэтому не требуется дополнительное умножение на 2. – hotpaw2

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