Как я могу получить частоты из сигнала? - PullRequest
1 голос
/ 21 марта 2019

Я ищу способ получить частоту от сигнала.
Давайте создадим пример вместе

signal = [numpy.sin(numpy.pi * x / 2) for x in range(1000)]

Этот массив будет представлять образец записанного звука. (х = миллисекунды)
sin (pi * x / 2) => 250 Гц

Теперь изображение, мы понятия не имеем, как выглядит функция. Мы только что получили сигнал (список точек. Как мы можем получить частоту из этого массива?

Важно:
Я прочитал много тем Stackoverflow и смотрю много видео на YouTube. Я еще не нашел ответ. Пожалуйста, используйте простые слова. (Я благодарен за каждый ответ)

1 Ответ

0 голосов
/ 21 марта 2019

Кажется, что вы хотите получить преобразование Фурье сигнала из вики:

Преобразование Фурье (FT) разлагает функцию времени (сигнал)в частотах, составляющих его

По сути, это математическая операция, которая при применении к сигналу дает представление о том, как присутствует каждая частота во временном ряду.Чтобы понять это, было бы полезно взглянуть на математическое определение DFT :

enter image description here

Где k здесь развернуто до t N-1, чтобы вычислить все DFT коэффициенты.

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

. При этом следует учитывать, что это, по сути, вычисление корреляции, когда соответствующий синус или косинус из разложения комплексной экспоненты совпадает с синусоидой сложного1029 *, будет пик в X(K), что означает, что такая частота присутствует в сигнале.


Итак, дав очень краткое теоретическое обоснование, давайте рассмотрим пример, чтобы увидеть, как этоможет быть реализовано в Python.Давайте рассмотрим следующий сигнал :

Fs = 150.0;  # sampling rate
Ts = 1.0/Fs; # sampling interval
t = np.arange(0,1,Ts) # time vector

ff = 50;   # frequency of the signal
y = np.sin(2*np.pi*ff*t)

Теперь, DFT можно вычислить с помощью np.fft.fft, который, как уже упоминалось, будет сообщать вам, чтовклад каждой частоты в сигнал теперь в преобразованной области:

n = len(y) # length of the signal
k = np.arange(n)
T = n/Fs
frq = k/T # two sides frequency range
frq = frq[:len(frq)//2] # one side frequency range

Y = np.fft.fft(y)/n # dft and normalization
Y = Y[:n//2]

Теперь, если мы построим реальный спектр, вы увидите, что мы получаем пик на частоте 50 Гц, что в математических терминахэто будет дельта-функция с центральной частотой 50 Гц.Это можно проверить в следующей таблице пар преобразования Фурье .

Таким образом, для используемого сигнала мы получили бы:

plt.plot(frq,abs(Y)) # plotting the spectrum
plt.xlabel('Freq (Hz)')
plt.ylabel('|Y(freq)|')

enter image description here

...