2016-03-29 1 views
1

Я черчение синусоидальных волн (левый столбец) и их представления соответствующих частотной области (правая колонка):преобразование Фурья синусоид с неожиданными результатами

  • Первой волной (амплитуда: 10; частота: 0,5) имеет немного перепутанное fft-представление
  • Вторая волна (амплитуда: 15; частота: 5.0) выглядит абсолютно как ожидалось.
  • Третья волна только первая и вторая волна суммируется и наследует проблемы

второй частота участок имеет ровно один пик при х = 5 (частота), у = 15 (амплитуды).

Почему первая частотная диаграмма имеет несколько пиков при наличии только одной частоты?

enter image description here

import numpy as np 
import matplotlib.pyplot as plt 

def sine(freq, time_interval, rate, amp=1): 
    w = 2. * np.pi * freq 
    t = np.linspace(0, time_interval, time_interval*rate) 
    y = amp*np.sin(w * t) 
    return y 

def buildData(): 
    secs = 3 
    Fs = 44100 
    # frequency, duration, sampling rate, amplitude 
    y1 = sine(0.5, secs, Fs, 10) 
    y2 = sine(5, secs, Fs, 15) 
    y3 = y1 + y2 
    signals = [y1, y2, y3] 
    showSignals(signals, Fs, secs) 

def showSignals(signals, fs, secs): 
     nrSigs = len(signals) 
     fig = plt.figure() 
     fig.subplots_adjust(hspace=.5) 
     for i in range(len(signals)): 
      cols=2 
      pltIdc = [] 
      for col in range(1,cols+1): 
       pltIdc.append(i*cols+col) 
      s = signals[i] 
      t = np.arange(0, secs, 1.0/fs) 
      ax1 = plt.subplot(nrSigs, cols, pltIdc[0]) 
      ax1.set_title('signal') 
      ax1.set_xlabel('time') 
      ax1.set_ylabel('amplitude') 
      ax1.plot(t, s) 

      amps = 2*abs(np.fft.fft(s))/len(s) # scaled power spectrum 
      amps = amps[0:len(amps)/2] # because of the symmetry 
      amps = amps[0:50] # only the first 50 frequencies, arbitrarily chosen 
      # this should be close to the amplitude: 
      print 'magnitude of amplitudes: ' + str(sum(amps*amps)**0.5) 
      freqs=np.arange(0, len(amps), 1)/secs 
      ax2 = plt.subplot(nrSigs, cols, pltIdc[1]) 
      ax2.grid(True) 
      ax2.set_title(r"$\frac{2 \cdot fft(s)}{len(s)}$") 
      ax2.set_xlabel('freq') 
      ax2.set_ylabel('amplitude') 
      ax2.stem(freqs, amps) 
     plt.show() 

buildData() 

ответ

0

Процедура БПФ выполняет быстрое (реализации) дискретное преобразование Фурье, которое разлагает сигнал временного ряда в N-длины ортонормированному, состоящей из Фурье «корней из единицы».

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

Ваш первый пример состоит из 1,5 циклов в окне анализа, поэтому он не может быть корнем из единицы (одно свойство базисных функций Фурье состоит в том, что они имеют интегральное количество циклов в окне анализа). Следовательно, существует ненулевое «смещение по постоянному току» (среднее значение по окну анализа не равно нулю), которое всегда будет давать термин «DC» (ненулевой вклад Фурье при индексе 0, соответствующий смещению постоянного тока). Поскольку это нецелое число циклов в окне анализа, вы также получаете вклад от других частот из БПФ в дополнение к доминирующему вкладу от частоты, ближайшей к вашей синусоиде. Это как и ожидалось - любая синусоида, которая сама по себе не является функцией Фурье, будет иметь ненулевое внутреннее произведение с множеством основных функций Фурье (и, следовательно, множественными спектральными вкладами в выход БПФ).

Ваш третий пример - это просто сумма двух других, поэтому по линейности преобразования Фурье выход БПФ представляет собой просто сумму БПФ двух отдельных сигналов. Это также ожидается: FFT (a + b) = FFT (a) + FFT (b).

0

ДПФ или БПФ будут производить только одноточечный результат (всплеск на графике) из синусоиды, если частота периодична точно в целых числах периодов в длине БПФ. В противном случае энергия будет распределена между всеми остальными БПФ (но в основном в соседних результирующих ячейках). Это не «перепутано», а нормальное ожидаемое поведение для DFT с конечной длиной.

+0

Спасибо. Каковы общие методы обработки окон для обработки нецелых циклов? Особенно, когда речь идет о реальных данных. Хэмминг/Ханнинг? – bogus

+0

@bogus: Это отличный вопрос; но отдельный вопрос, который должен быть задан как отдельный вопрос здесь или в dsp.stackexchange, а не как комментарий – hotpaw2

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

  • Нет связанных вопросов^_^