2015-06-05 17 views
6

Tôi là người mới trong xử lý tín hiệu, trong câu hỏi này, tôi muốn hỏi cách lấy năng lượng cho mỗi băng tần xung quanh tần số quan tâm F. Tôi đã tìm được công thức, nhưng tôi không biết cách thực hiện nó bằng Python. Đây là công thức và Fourier của tôi thay đổi cốt truyện: enter image description hereTính toán năng lượng cho mỗi dải tần số xung quanh tần số F quan tâm trong Python

x = np.linspace(0,5,100) 
y = np.sin(2*np.pi*x) 

## fourier transform 
f = np.fft.fft(y) 
## sample frequencies 
freq = np.fft.fftfreq(len(y), d=x[1]-x[0]) 
plt.plot(freq, abs(f)**2) ## will show a peak at a frequency of 1 as it should. 

enter image description here

+1

bạn rất gần, có gì sai với 'sum (abs (f [Fd: F + d]) ** 2)'? – Mike

Trả lời

0

Sử dụng các module xử lý tín hiệu từ Finding local maxima/minima with Numpy in a 1D numpy array bạn sẽ làm như sau:

from scipy.signal import argrelextrema 
import numpy as np 

delta = 0.1 
F = 1 
X_delta = abs(freq - F) < delta 
A_f_delta = abs(f[X_delta])**2 
maximum_ix = argrelextrema(A_f, np.greater) 
E_F_delta = np.sum(A_f[maximum_ix])/2 
E_F_delta 
2453.8235776144866 
+0

Tôi không thấy làm thế nào điều này trả lời câu hỏi: năng lượng E_F trong công thức tổng các hệ số Fourier bình phương * xung quanh tần số F *, trên một * chiều rộng tần số * Delta. Câu trả lời này là gì hoàn toàn khác: nó hạn chế tổng số tới cực đại địa phương (một điểm) chính xác (không có Delta, thậm chí, trong giải pháp này, vì vậy nó thậm chí không thể hoạt động!). – EOL

+0

oy ok vì vậy tôi thêm F và delta vào câu trả lời của tôi, tôi nghĩ rằng nó đã được ngầm định trong câu trả lời đầu tiên của tôi mặc dù ... nó không cần thiết để trả lời câu hỏi, vì nó chỉ có một tần số duy nhất. – maxymoo

+1

Điều này là tốt, nhưng tại sao tất cả các dòng bắt đầu tại 'maximum_ix': bạn trả lời câu hỏi tại dòng 'A_f_delta =…' (được gọi là E_F trong câu hỏi gốc). Lưu ý phụ: với đối số của bạn về tần số đơn giản chỉ nhìn vào các đỉnh, bạn có thể đi tất cả các cách và thậm chí tổng hợp tất cả các biên độ bình phương, vì 'argrelextrema()' chọn lên biên độ không đáng kể duy nhất. Điều đó rõ ràng là khá vô ích, trong trường hợp chung, vì định lý của Parseval (vì kết quả sẽ giống như làm tương tự trên tín hiệu gốc). – EOL

0

Bạn đang ở gần đó như Mike chỉ nhưng đây là một cách tiếp cận khác nhau mà là đơn giản để hiểu. Bạn có thể thiết lập một biến chứa tín hiệu lọc và trả về một mảng 1d của Af, sau đó áp dụng thứ e trên công thức khá đơn giản (bình phương tổng của các biên độ)

Lọc ra các tín hiệu như thế này

from scipy.signal import butter, lfilter 
def butter_bandpass(lowcut, highcut, fs, order=5): 
    nyq = 0.5 * fs 
    low = lowcut/nyq 
    high = highcut/nyq 
    b, a = butter(order, [low, high], btype='band') 
    return b, a  
def butter_bandpass_filter(data, lowcut, highcut, fs, order=5): 
    b, a = butter_bandpass(lowcut, highcut, fs, order=order) 
    y = lfilter(b, a, data) 
    return y 

tại giả y là tín hiệu ban đầu của bạn và bạn cần năng lượng của 5Hz thành phần trong tín hiệu,

#let fs = 250 
#let order = 5 
oneD_array_of_amps_of_fiveHz_component = butter_bandpass_filter(y, 4, 6, 250, 5) 
#calculate energy like this 
energy_of_fiveHz_comp = sum([x*2 for x in oneD_array_of_amps_of_fiveHz_component]) 
Các vấn đề liên quan