Có đúng không khi trừ một tín hiệu được lọc thông thấp từ tín hiệu gốc và sử dụng kết quả như một tín hiệu cao vượt qua?


8

Tôi đang gặp khó khăn khi cố gắng tìm tài liệu để triển khai bộ lọc band-pass hoặc high-pass với python / scipy / numpy.

Tuy nhiên, tôi có thể dễ dàng tạo và áp dụng bộ lọc thông thấp, vì vậy tôi hỏi:

Liệu nó có đúng về mặt khái niệm đối với bộ lọc thông thấp một tín hiệu, sau đó trừ kết quả khỏi tín hiệu ban đầu, để chỉ nhận được các tần số cao?

Ngoài ra, nếu bất cứ ai có một ví dụ đơn giản về bộ lọc bandpass ngây thơ trong Python (tốt nhất là sử dụng các thư viện numpy và scipy), tôi sẽ rất biết ơn.

Những gì tôi tìm kiếm là một cái gì đó như:

filtered_signal = band_pass(original_signal, rate, low=20, high=500)

Cảm ơn vì bất kì sự giúp đỡ!

EDIT: với scipy, tôi đang sử dụng điều này ở mức thấp, với kết quả tốt:

import numpy, scipy.signal

def firfilt(interval, freq, sampling_rate):
    nfreq = freq/(0.5*sampling_rate)
    taps =  sampling_rate + 1
    a = 1
    b = scipy.signal.firwin(taps, cutoff=nfreq)
    firstpass = scipy.signal.lfilter(b, a, interval)
    ## second pass to compensate phase delay
    secondpass = scipy.signal.lfilter(b, a, firstpass[::-1])[::-1]
    return secondpass

Các tài liệu cho scipy.signal.firwinnói như thế nào để làm cho thông thấp, thông cao, band-pass, ban nhạc ngừng, và các bộ lọc đa băng tần. Bạn đã thử firwin(taps, cutoff=nfreq, pass_zero=False)chưa
endolith

Xem sound.whsites.net/articles/deriving-xovers.htm để sử dụng kỹ thuật này trong loa
endolith

Câu trả lời:


7

Về lý thuyết bạn có thể làm điều này, nhưng trong thực tế thì khó thực hiện vì thời gian và pha phải khá tốt để nó hoạt động. Nếu căn chỉnh là tốt, bạn sẽ nhận được sự can thiệp phá hoại mà bạn đang tìm kiếm. Nếu họ không, bạn sẽ nhận được một số can thiệp mang tính xây dựng. Thậm chí tệ hơn, việc chúng có bị can thiệp triệt tiêu hay có tính xây dựng hay không sẽ phụ thuộc vào tần số - tức là bạn có thể nhận được cả giao thoa mang tính xây dựng và phá hoại cùng một lúc. Tuy nhiên, nó có thể hoạt động nếu bạn chỉ lọc ra các tần số khá thấp, vì các yêu cầu về thời gian của chúng là lỏng lẻo nhất vì chúng thay đổi rất chậm.

Truyện ngắn - có thể làm được nhưng đủ khó để nói chung có ý nghĩa khi chỉ thực hiện bộ lọc thông cao.

Một cách tương đối đơn giản để tạo bộ lọc thông dải là tạo bộ lọc thông thấp, sau đó điều chỉnh nó theo tần số trung tâm bạn muốn bằng cách nhân nó với một hình sin có tần số đó.


Tôi có xu hướng vượt qua bộ lọc hai lần, một trong số chúng ngược lại, để bù cho sự dịch pha.
heltonbiker

@heltonbiker Sau đó, bạn sẽ có thể làm theo cách đó, miễn là bạn sắp xếp thời gian đúng và đảm bảo mức tăng của bộ lọc thông thấp là 1.
Jim Clay

4

Bạn có thể thiết kế các loại bộ lọc khác nhau trực tiếp với các hàm scipy.signal. Có ba chức năng chính để tạo các bộ lọc đáp ứng xung hữu hạn với gói scipy.signal.

  1. signal.ternalz
  2. signal.firwin
  3. signal.firwin2

Hàm remez , dưới dạng đối số, lấy số lượng vòi (thứ tự + 1), "băng tần" và mức tăng "mong muốn". Các "dải" tính bằng Hz. Funciton này hơi kỳ lạ khi tham số "Hz" xác định tốc độ mẫu tính bằng Hz. Một ví dụ sẽ là:

from scipy import signal
b = signal.remez(64, [0, 80, 100, 200, 220, 500], [0, 1, 0], Hz=1000)
plot(20*log10(abs(fft.fft(b, 4096).)))

Phản hồi thường xuyên

Lưu ý: Tôi đã gian lận một chút và sử dụng FFT bậc cao hơn để làm cho cốt truyện trông đẹp hơn một chút (nội suy các điểm chỉ để trực quan hóa).

Ví dụ về đường thông thấp và đường cao tốc:

bl = signal.remez(64, [0, 248, 252, 500], [1, 0], Hz=1000) #lowpass
bh = signal.remez(64, [0, 248, 252, 500], [0, 1], Hz=1000) #highpass

Hàm Firwin lấy số lần chạm một lần nữa và điểm cắt làm đối số. Điểm cắt có thể là nhiều giá trị dưới dạng danh sách để xác định bộ lọc băng thông và băng chặn. Đơn vị mặc định cho mức cắt là tần số chuẩn hóa trong đó mức cắt nyquist là 1 và tốc độ mẫu sẽ là 2. Điều này có thể được sửa đổi bằng cách đặt / nyq /. Sử dụng các ví dụ trên Firwin sẽ được gọi là:

b = signal.firwin(64, [100, 200], pass_zero=False, nyq=500)

Các firwin2 là gần gũi hơn với các funcion remez. Nhưng thay vì vượt qua mức tăng cho các ban nhạc bạn vượt qua mức tăng ở mức cắt.

b = signal.firwin2(64, [0, 100, 200, 500], [0, 1, 1, 0], nyq=500)

Thêm ví dụ có sẵn ở đây


firwinvà trình bao bọc của nó butterlà những gì tôi đang sử dụng. Cảm ơn!
heltonbiker

2
bơ không phải là một gói cho Firwin. Bơ là một phương pháp thiết kế bộ lọc IIR. Chức năng iirdesign là một công cụ thiết kế bộ lọc IIR cho mục đích chung. Trong đó bơ, chew, v.v. là các hàm Matlab'ish. Thông tin thêm về các chức năng của bộ lọc IIR tại đây, bit.ly/JPS4Zs
Christopher Felton

Tôi đoán tôi đã hiểu nhầm những gì tôi đang làm. Gonna kiểm tra xem, cảm ơn (vì tôi chắc chắn muốn có bộ lọc FIR).
heltonbiker

3

Bạn đã chỉ ra rằng bạn đang gặp khó khăn khi tìm ra cách thiết kế bộ lọc đường cao tốc phù hợp. Một phương pháp là trước tiên thiết kế một nguyên mẫu bộ lọc thông thấp, sau đó áp dụng một biến đổi làm cong phản ứng của bộ lọc thành một bộ lọc loại khác (chẳng hạn như bộ lọc thông cao hoặc bộ lọc băng thông). Điều này được thực hiện bằng cách thay thế một biểu thức cho vào hàm truyền của bộ lọc thông thấp nguyên mẫu. Dưới đây là một số liên kết đến thông tin về chủ đề:z-1

Cụ thể, đối với chuyển đổi đường từ thấp đến đường cao tốc, bạn có thể áp dụng thay thế sau:

α=cos ( 1

z-1= =α+z-11+αz-1,
α= =cos(12(ωc-ωc'))cos(12(ωc+ωc'))

Trong đó là tần số cắt của nguyên mẫu bộ lọc thông thấp và là tần số cắt kết quả trong bộ lọc thông cao được chuyển đổi. Có một số ví dụ được đưa ra trong tài liệu MATLAB được hiển thị trong liên kết đầu tiên.; có thể có các chức năng tương tự có sẵn trong SciPy. Như đã nói, phần lớn các chức năng thiết kế bộ lọc trong thư viện đó theo sát ví dụ của MATLAB và chúng có khả năng thiết kế các bộ lọc của tất cả các loại chính (đường thông thấp, đường cao tốc, v.v.) với rất ít nỗ lực.ω ' cωcωc'


Cảm ơn sự quan tâm của bạn, nhưng tôi phải thừa nhận rằng tôi không có đủ nền tảng để tiêu hóa thông tin toán học / kỹ thuật quá mức mà bạn đã đăng, tôi đến từ lĩnh vực khoa học sinh học và đang mong đợi một câu trả lời thẳng thắn hơn. Nếu nỗ lực tạo đường cao tương đối ít, có thể đăng một số mã làm việc nhỏ hoặc liên kết đến một ví dụ không?
heltonbiker

Những loại bộ lọc bạn đã và đang sử dụng? Bạn đã thiết kế chúng bằng chức năng thư viện SciPy?
Jason R

Tôi sẽ chỉnh sửa câu hỏi với thẻ thông hành thấp mà tôi đang sử dụng
heltonbiker

1
Xem bình luận của endolith ở trên về câu hỏi của bạn. Như ông đã chỉ ra, chức năng mà bạn đang sử dụng để tạo bộ lọc của mình dường như cũng có khả năng thiết kế các bộ lọc đường cao tốc.
Jason R
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.