bộ lọc thông thấp và FFT cho người mới bắt đầu với Python


23

Tôi chưa quen với việc xử lý tín hiệu và đặc biệt là FFT, do đó tôi không chắc liệu mình có đang làm đúng hay không và tôi hơi bối rối với kết quả này.

Tôi có một hàm thực rời rạc (dữ liệu đo lường) và muốn thiết lập bộ lọc thông thấp trên đó. Công cụ được lựa chọn là Python với gói numpy. Tôi làm theo thủ tục này:

  • tính toán fft của hàm của tôi
  • cắt tần số cao
  • thực hiện nghịch đảo fft

Đây là mã mà tôi đang sử dụng:

import numpy as np
sampling_length = 15.0*60.0 # measured every 15 minutes
Fs = 1.0/sampling_length
ls = range(len(data)) # data contains the function
freq = np.fft.fftfreq(len(data), d = sampling_length)
fft = np.fft.fft(data)
x = freq[:len(data)/2] 
for i in range(len(x)):
if x[i] > 0.005: # cut off all frequencies higher than 0.005
    fft[i] = 0.0
    fft[len(data)/2 + i] = 0.0
inverse = np.fft.ifft(fft)

Đây có phải là thủ tục chính xác? Kết quả inversechứa các giá trị phức tạp, làm tôi bối rối.


1
Khi tôi học FFT, tôi thấy bài viết trên blog này rất hữu ích. glowingpython.blogspot.com/2011/08/ Tờ
David Poole

Câu trả lời:


23

Thực tế là kết quả là phức tạp sẽ được dự kiến. Tôi muốn chỉ ra một vài điều:

Bạn đang áp dụng bộ lọc miền tần số tường gạch cho dữ liệu, cố gắng loại bỏ tất cả các đầu ra FFT tương ứng với tần số lớn hơn 0,005 Hz, sau đó chuyển đổi ngược lại để lấy lại tín hiệu miền thời gian. Để kết quả là thực, thì đầu vào của FFT nghịch đảo phải là đối xứng liên hợp . Điều này có nghĩa là với chiều dài- FFT,N

X[k]= =X*[N-k],k= =1,2,Giáo dục,N2-1(Neven)

X[k]= =X*[N-k],k= =1,2,Giáo dục,N2(Nodd)
  • Lưu ý rằng đối với chẵn, X [ 0 ]X [ NNX[0]nói chung không bằng nhau, nhưng cả hai đều có thật. Đối vớiNlẻ,X[0]phải là số thực.X[N2]NX[0]

Tôi thấy rằng bạn đã cố gắng làm một cái gì đó như thế này trong mã của bạn ở trên, nhưng nó không hoàn toàn chính xác. Nếu bạn thực thi điều kiện trên đối với tín hiệu mà bạn chuyển đến FFT nghịch đảo, thì bạn sẽ nhận được tín hiệu thực.

Stôinc(x)Stôinc

Stôinc

cốt truyện của chức năng chân thành

StôincStôinc

Có nhiều phương tiện thiết thực hơn để áp dụng các bộ lọc thông thấp, cả trong miền thời gian và tần số. Đáp ứng xung hữu hạn và các bộ lọc đáp ứng xung vô hạn có thể được áp dụng trực tiếp bằng cách sử dụng biểu diễn phương trình sai khác của chúng . Hoặc, nếu bộ lọc của bạn có đáp ứng xung đủ dài, bạn thường có thể thu được lợi ích hiệu suất bằng cách sử dụng các kỹ thuật tích chập nhanh dựa trên FFT (áp dụng bộ lọc bằng cách nhân trong miền tần số thay vì tích chập trong miền thời gian), như chồng chéo lưuchồng chéo-thêm phương thức.


Các chức năng chân là lọc lý tưởng, mặc dù, không? Đó là điều mà tất cả các bộ lọc khác đang hướng tới, nhưng không đạt được. Thật tệ khi xử lý hình ảnh vì hình ảnh không được khử răng cưa trước, vì vậy nó tạo ra tiếng chuông trông khủng khiếp, nhưng đối với âm thanh hoặc các tín hiệu khác được lọc trước khi lấy mẫu, đó có phải là bộ lọc tốt nhất bạn có thể nhận được không?
endolith

1
Có, kết quả của tôi không đối xứng. Tôi đã sửa mã, bây giờ mọi thứ hoạt động tốt. Cảm ơn bạn!
Đến

3
@endolith - một Sinc là một bộ nội suy lý tưởng để xác nhận các loại nội suy, nhưng có thể khác xa lý tưởng như một bộ lọc cho hầu hết các loại yêu cầu bộ lọc phổ biến, chẳng hạn như độ phẳng của đáp ứng băng thông, dừng từ chối băng tần, v.v.
hotpaw2

+1 cho lời giải thích hay về "lý do tại sao mọi người không triển khai bộ lọc như PO"
Đánh bạc Sibbs

Bạn phải sử dụng một cửa sổ chân thành. Nếu bạn không bị hạn chế về thời gian, đây là bộ lọc tối ưu, tốt hơn nhiều so với Chebichev.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.