Apakah sinyal high-pass sama dengan sinyal minus sinyal low-pass?

14

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.

masukkan deskripsi gambar di sini

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.

masukkan deskripsi gambar di sini

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')
Titik pasti
sumber
1
Pesanan filter Anda sangat tinggi. Kemungkinannya adalah Anda mengalami masalah numerik selama proses desain. Periksa filter yang dirancang dengan menghitung dan merencanakan besarnya FFT. Selanjutnya, lihat jawaban saya di bawah ini untuk cara menggunakan pengurangan untuk menghasilkan filter high-pass dari filter low-pass.
Matt L.
Anda dapat membuat sinyal jalan pintas dengan cara ini, tetapi urutan roll-off selalu menjadi urutan pertama: sound.westhost.com/articles/derived-xovers.htm Jika Anda pertama kali menunda sinyal dengan penundaan kelompok LPF sebelum mengurangi , Anda bisa mendapatkan pesanan ke-3
endolit

Jawaban:

8

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

(1)H(ω)=1-HL.P(ω)

di mana adalah respons frekuensi filter low-pass. Perhatikan bahwa adalah fungsi yang kompleks. Yang mungkin Anda inginkan adalahHL.P(ω)HL.P(ω)

(2)|H(ω)|=|1-|HL.P(ω)||

tetapi ini umumnya tidak terjadi ketika (1) puas.

Sekarang tulis sebagaiHL.P(ω)

HL.P(ω)=|HL.P(ω)|ejϕ(ω)

di mana adalah respons fase dari filter low pass. Jika Anda menetapkan filter sebagaiϕ(ω)

(3)HHP(ω)=ejϕ(ω)-HL.P(ω)=ejϕ(ω)(1-|HL.P(ω)|)

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

(4)ejϕ(ω)=e-jωτ

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:

  • merancang filter low-pass FIR fase linear dengan urutan genap
  • saring sinyal menggunakan filter(); sebut saja hasilnyaxL.P[n]
  • tunda sinyal asli dengan sampel; sebut saja sinyal yang tertundaτ=n/2xd[n]
  • menghasilkan sinyal high-pass filtered dengan mengurangi:xHP[n]=xd[n]-xL.P[n]

Berikut adalah ilustrasi yang sangat sederhana di Matlab / Oktaf

h_lp = fir1 (100, .3); % desain low-pass
h_hp = [nol (50,1); 1; nol (50,1)] - h_lp; % desain high-pass dengan pengurangan
[H_lp, w] = freqz (h_lp, 1,1024);
[H_hp, w] = freqz (h_hp, 1,1024);
plot (w / 2 / pi, 20 * log10 (abs (H_lp)), w / 2 / pi, 20 * log10 (abs (H_hp))))
kisi, sumbu ([0, .5, -100,5])

masukkan deskripsi gambar di sini

EDIT:

Karena Anda menggunakan filtfiltperintah, 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 oleh filtfiltfungsi (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 memilihn=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.

x = memuat ('data.txt'); % data yang akan difilter
h_lp = fir1 (100, .3); % Tanggapan impuls LP
h_hp = fir1 (100, .3, 'high'); % Tanggapan impuls HP
y = filtfilt (h_lp, 1, x); % menerapkan filter low pass
yh = filtfilt (h_hp, 1, x); % menerapkan filter lulus tinggi
yd = x - yh; % low pass by difference dengan filter high pass
n = 1: panjang (x);
plot (n, x, n, y, 'g.', n, yd, 'r')
sumbu ([3500.4000.140.150])

masukkan deskripsi gambar di sini

Matt L.
sumber
Jika Anda mencoba mendesain filter high pass dengan cara ini, Anda harus berhati-hati dengan spesifikasi filter low-pass. Redaman band stop pada filter low-pass biasanya cukup tinggi untuk mencapai riak band pass kecil di high pass, tetapi riak band pass pada filter LP sering tidak mencapai atenuasi stop band yang cukup dalam filter HP.
David
Terima kasih atas respon yang mendetail. Itu membersihkan beberapa hal.
Fixed Point
3

Mengenai penskalaan:

Jika Anda menjumlahkan koefisien, Anda mendapatkan besarnya untuk DC. Karenanya, masuk akal bahwa Anda mendapatkan angka-angka itu ( untuk LP, untuk HP).10

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,

|HL.P|+|HHP|=1

Saat membuat filter dari dua bagian allpass paralel dan menambah / mengurangi output, filter lowpass / highpass akan menjadi pelengkap daya , yaitu,

|HL.P|2+|HHP|2=1

Oscar
sumber