Pertanyaan saya adalah, jika saya ingin sinyal high-pass, apakah sama dengan sinyal low-passing dan mengurangkannya dari sinyal? Apakah secara teori sama? Apakah ini praktis sama?
Saya telah mencari (baik di google dan dsp.stackexchange) dan saya menemukan jawaban yang bertentangan. Saya telah bermain dengan sinyal dan inilah hasilnya. Saya tidak bisa memahaminya. Ini adalah sinyal dengan frekuensi pengambilan sampel setiap empat detik sekali. Saya merancang filter low-pass digital dengan pita transisi dari 0,8 mHz ke 1 mHz dan memfilter sinyal. Saya kemudian merancang filter high-pass dengan pita transisi yang sama dan memfilter sinyal. Inilah hasilnya.
Gambar pertama ini menunjukkan sinyal asli berwarna hitam dan sinyal low-pass berwarna biru. Mereka hampir di atas satu sama lain tetapi tidak cukup. Kurva merah adalah sinyal minus sinyal lewat tinggi yang tepat di atas sinyal.
Gambar kedua ini adalah yang pertama diperbesar untuk menunjukkan apa yang terjadi. Di sini kita melihat bahwa keduanya jelas tidak sama. Pertanyaan saya adalah mengapa? Apakah ini tentang bagaimana saya menerapkan kedua filter atau apakah itu sesuatu yang secara teoritis terlepas dari implementasi saya? Saya tidak tahu banyak tentang mendesain filter tetapi saya tahu itu terkenal kontra-intuitif. Ini adalah kode MATLAB lengkap untuk mereproduksi semua ini. Saya menggunakan perintah filtfilt untuk menghilangkan penundaan fase. Tetapi satu hal lagi yang perlu ditunjukkan di sini adalah bahwa filter tidak dinormalisasi. Ketika saya melakukan penjumlahan (Hd.Numerator), saya mendapatkan 0,9930 untuk low-pass dan 0,007 untuk high-pass. Saya tidak melihat bagaimana menjelaskan ini. Haruskah output diskalakan karena koefisien tidak bertambah satu? Bisakah penskalaan ini ada hubungannya dengan ini?
close all
clear all
clc
data = dlmread('data.txt');
Fs = 0.25; % Sampling Frequency
N = 2674; % Order
Fpass = 0.8/1000; % Passband Frequency
Fstop = 1/1000; % Stopband Frequency
Wpass = 1; % Passband Weight
Wstop = 1; % Stopband Weight
dens = 20; % Density Factor
% Calculate the coefficients using the FIRPM function.
b = firpm(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop], {dens});
Hd = dsp.FIRFilter('Numerator', b);
sum(Hd.Numerator)
datalowpassed = filtfilt(Hd.Numerator,1,data);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Fs = 0.25; % Sampling Frequency
N = 2674; % Order
Fstop = 0.8/1000; % Stopband Frequency
Fpass = 1/1000; % Passband Frequency
Wstop = 1; % Stopband Weight
Wpass = 1; % Passband Weight
dens = 20; % Density Factor
% Calculate the coefficients using the FIRPM function.
b = firpm(N, [0 Fstop Fpass Fs/2]/(Fs/2), [0 0 1 1], [Wstop Wpass], {dens});
Hd = dsp.FIRFilter('Numerator', b);
sum(Hd.Numerator)
datahighpassed = filtfilt(Hd.Numerator,1,data);
figure
subplot(2,1,1)
plot(data,'-ko')
hold on
plot(datalowpassed,'-bo')
plot(data-datahighpassed,'-ro')
legend('Original Signal','Low-Passed','Signal - High-Passed')
subplot(2,1,2)
plot(data-datalowpassed,'-bo')
hold on
plot(datahighpassed,'-ro')
legend('Signal - Low-Passed','High-Passed')
Jawaban:
Secara umum, Anda tidak bisa begitu saja mengurangi versi sinyal low-pass filter dari sinyal asli untuk mendapatkan sinyal high-pass filtered. Alasannya adalah sebagai berikut. Apa yang sebenarnya Anda lakukan adalah menerapkan sistem dengan respons frekuensi
di mana adalah respons frekuensi filter low-pass. Perhatikan bahwa adalah fungsi yang kompleks. Yang mungkin Anda inginkan adalahHL P( ω ) HL P( ω )
tetapi ini umumnya tidak terjadi ketika (1) puas.
Sekarang tulis sebagaiHL P( ω )
di mana adalah respons fase dari filter low pass. Jika Anda menetapkan filter sebagaiϕ ( ω )
maka filter baru ini akan memuaskan relasi magnitude (2). Jadi jika Anda melakukan pengurangan seperti pada (3), Anda dapat mewujudkan filter high-pass dengan respons magnitude yang saling melengkapi dengan respons filter low pass. Ini berarti bahwa Anda perlu memfilter sinyal dengan filter semua pass dengan respons frekuensi sebelum mengurangkannya dari versi low-pass filter dari sinyal.ej ϕ ( ω )
Dalam praktiknya ini sangat sederhana jika filter low-pass memiliki respons fase linier , karena kemudian istilah fase diberikan oleh
dan sesuai dengan penundaan sederhana. Filter FIR dapat memiliki respons fase linier persis, dan yang dirancang oleh algoritma Parks-McClellan memiliki fase linier. Adalah menguntungkan untuk membuat penundaan dalam (4) bilangan bulat, yang dicapai dengan memilih urutan filter genap :τ n τ= n / 2
Jadi yang harus Anda lakukan adalah sebagai berikut:
filter()
; sebut saja hasilnyaBerikut adalah ilustrasi yang sangat sederhana di Matlab / Oktaf
EDIT:
Karena Anda menggunakann = 100 ), Anda mendapatkan apa yang Anda harapkan. Pada gambar di bawah ini Anda melihat bagian dari data berwarna biru, output dari filter low pass berwarna hijau, dan hasil dari pengurangan output filter high pass dari data asli berwarna merah. Kurva hijau dan merah pada dasarnya identik.
filtfilt
perintah, fase secara artifisial dihilangkan, dan Persamaan (1) dan (2) di atas menjadi setara, karena semua respons frekuensi sebenarnya kuadrat besarnya respon yang dirancang. Jadi, terlepas dari perbedaan kecil karena proses desain filter, kesalahan numerik, dan perbedaan kecil yang disebabkan olehfiltfilt
fungsi (kondisi awal yang dipilih secara otomatis meminimalkan awal dan akhir transien), hasil dari pengurangan data yang disaring dari data asli harus mirip dengan penyaringan langsung dengan filter pelengkap. Karena ini bukan kasus dalam contoh Anda, saya menduga bahwa desain filter rutin memberi Anda masalah karena urutan filter yang sangat tinggi. Jika Anda melakukan hal yang sama dengan filter sederhana (saya memilihsumber
Mengenai penskalaan:
Jika Anda menjumlahkan koefisien, Anda mendapatkan besarnya untuk DC. Karenanya, masuk akal bahwa Anda mendapatkan angka-angka itu ( untuk LP, untuk HP).≈ 1 ≈ 0
Selain jawaban Matt L. yang sangat bagus, orang bisa saja menunjukkan bahwa apa yang dia gunakan disebut sebagai filter komplementer magnitudo , yang merupakan kasus umum untuk filter FIR fase-linear, yaitu,
Saat membuat filter dari dua bagian allpass paralel dan menambah / mengurangi output, filter lowpass / highpass akan menjadi pelengkap daya , yaitu,
sumber