Yüksek geçişli bir sinyal, eksi düşük geçişli bir sinyal ile aynı mıdır?


14

Benim sorum şudur: Eğer bir sinyalin yüksek-geçişini yapmak istersem, bir sinyalin düşük-geçişi ve sinyalden çıkarılması ile aynı mıdır? Teorik olarak aynı mı? Pratik olarak aynı mı?

(Hem google hem de dsp.stackexchange'te) arama yaptım ve çelişkili cevaplar buluyorum. Bir sinyal ile oynuyorum ve işte sonuçlar. Çok anlam ifade edemiyorum. İşte her dört saniyede bir kez örnekleme frekansı ile sinyaldir. 0.8 mHz'den 1 mHz'ye geçiş geçiş bandına sahip bir dijital düşük geçiş filtresi tasarladım ve sinyali filtreledim. Daha sonra aynı geçiş bandına sahip bir yüksek geçirgen filtre tasarladım ve sinyali filtreledim. Sonuçlar burada.

resim açıklamasını buraya girin

Bu ilk resim orijinal sinyali siyah, alçak geçirilen sinyali mavi gösterir. Neredeyse üst üste geliyorlar ama tam olarak değiller. Kırmızı eğri, sinyal eksi sinyalin hemen üstünde bulunan yüksek geçirilmiş sinyaldir.

resim açıklamasını buraya girin

Bu ikinci görüntü, neler olduğunu gösteren ilk yakınlaştırılmış görüntüdür. Burada açıkça görüyoruz ki ikisi aynı değil. Sorum neden? İki filtreyi nasıl uyguladığımla ilgili bir şey mi yoksa uygulamamdan bağımsız olarak teorik bir şey mi? Filtre tasarımı hakkında çok şey bilmiyorum ama bunun tersine sezgisel olduğunu biliyorum. Tüm bunları çoğaltmak için tam MATLAB kodu. Faz gecikmelerini ortadan kaldırmak için filtfilt komutunu kullanıyorum. Ancak burada belirtilmesi gereken başka bir şey, filtrelerin normalleştirilmemesidir. Toplamı yaptığımda (Hd.Numerator), düşük geçiş için 0.9930 ve yüksek geçiş için 0.007 alıyorum. Bunu nasıl açıklayacağımı göremiyorum. Katsayılar en fazla bir tane eklemediğinden çıktı bir şekilde ölçeklendirilmeli mi? Bu ölçeklemenin bununla bir ilgisi olabilir mi?

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')

1
Filtre siparişiniz çok yüksek. Muhtemelen tasarım sürecinde sayısal problemlerle karşılaşabilirsiniz. FFT'nin büyüklüğünü hesaplayıp çizerek tasarlanmış filtreleri kontrol edin. Ayrıca, düşük geçişli bir filtreden yüksek geçişli bir filtre oluşturmak için çıkarma işleminin nasıl kullanılacağı ile ilgili aşağıdaki cevabımı inceleyin.
Matt L.

Bu şekilde bir yüksekgeçir sinyali yapabilirsiniz, ancak başlangıç ​​sırası her zaman ilk sıradadır : sound.westhost.com/articles/derived-xovers.htm Çıkarmadan önce sinyali LPF'nin grup gecikmesiyle geciktirirseniz , 3. sipariş alabilirsiniz
endolith

Yanıtlar:


8

Genel olarak, yüksek geçişli filtrelenmiş bir sinyal elde etmek için orijinalinden bir sinyalin düşük geçişli filtrelenmiş bir versiyonunu çıkaramazsınız. Nedeni aşağıdaki gibidir. Gerçekte yaptığınız şey, frekans yanıtı olan bir sistem uygulamaktır

(1)H(ω)=1HLP(ω)

burada alçak geçiren filtrenin frekans cevabıdır. Not, karmaşık bir fonksiyondur. Muhtemelen istediğin şeyH L P ( ω )HLP(ω)HLP(ω)

(2)|H(ω)|=|1|HLP(ω)||

ancak bu genellikle (1) tatmin edici olduğunda geçerli değildir.

Şimdi yazmak olarakHLP(ω)

HLP(ω)=|HLP(ω)|ejϕ(ω)

burada alçak geçiren filtrenin faz yanıtıdır. Bir filtreyi şu şekilde tanımladıysanız:ϕ(ω)

(3)HHP(ω)=ejϕ(ω)HLP(ω)=ejϕ(ω)(1|HLP(ω)|)

bu yeni filtre gerçekten de büyüklük ilişkisini tatmin edecektir (2). Dolayısıyla, çıkarma işlemini (3) 'te olduğu gibi yaparsanız, düşük geçiş filtresinin yanıtını tamamlayıcı bir büyüklük yanıtı olan bir yüksek geçirgen filtre gerçekleştirebilirsiniz. Bu, sinyalin düşük geçişli filtrelenmiş versiyonunu çıkarmadan önce sinyali frekans tepkisine sahip bir all-pass filtresiyle filtrelemeniz gerektiği anlamına gelir .ejϕ(ω)

Uygulamada , düşük geçişli filtrenin doğrusal bir faz tepkisi varsa , bu çok basittir , çünkü o zaman faz terimi

(4)ejϕ(ω)=ejωτ

ve basit bir gecikmeye karşılık gelir. FIR filtreleri tam olarak doğrusal bir faz tepkisine sahip olabilir ve Parks-McClellan algoritması tarafından tasarlananlar doğrusal bir faza sahiptir. Gecikme yapmak avantajlıdır bir seçilmesi suretiyle elde edilmektedir (4) bir tam sayı, içinde bile filtre sırası :τnτ=n/2

Yani yapmanız gereken şudur:

  • düzgün bir düzen ile doğrusal faz FIR düşük geçiş filtresi tasarlayın
  • kullanarak sinyali filtreleyin filter(); sonucuxLP[n]
  • orijinal sinyali örnekle geciktirir ; gecikmiş sinyaliτ=n/2xd[n]
  • çıkarma yoluyla yüksek geçişli filtrelenmiş sinyal üretir:xHP[n]=xd[n]xLP[n]

İşte Matlab / Octave'de çok basit bir örnek

h_lp = köknar1 (100, .3); % düşük geçişli tasarım
h_hp = [sıfırlar (50,1); 1; sıfırlar (50,1)] - h_lp; Çıkarma ile% yüksek geçişli tasarım
[H_lp, w] = frek (h_lp, 1,1024);
[H_hp, w] = frek (h_hp, 1,1024);
arsa (/ 2 / pi w 20 * log 10 (abs (H_lp)) / 2 / pi w 20 * log 10 (abs (H_hp)))
ızgara, eksen ([0, .5, -100,5])

resim açıklamasını buraya girin

DÜZENLE:

filtfiltKomutu kullandığınızdan, faz yapay olarak elimine edilir ve yukarıdaki Denklemler (1) ve (2) eşdeğer hale gelir, çünkü tüm frekans yanıtları aslında tasarlanmış yanıtların kare büyüklükleridir. Bu nedenle, filtre tasarım süreci, sayısal hatalar ve filtfiltişlevin neden olduğu küçük farklılıklar (başlangıç ​​ve bitiş geçişlerini en aza indiren otomatik olarak seçilen başlangıç ​​koşulları) dışında, filtrelenmiş verilerin orijinal verilerden çıkarılmasının sonucu doğrudan filtrelemeye benzemelidir. tamamlayıcı bir filtre ile. Örneğinizde durum böyle olmadığından, filtre tasarımı rutininin son derece yüksek filtre sırası nedeniyle size sorun verdiğinden şüpheleniyorum. Aynı şeyi daha basit filtrelerle yaparsanız ( seçtimn=100), beklediğiniz şeyi alırsınız. Aşağıdaki şekilde, verinin bir bölümünü mavi, alçak geçiren filtrenin çıktısını yeşil ve yüksek geçiren filtrenin çıkışının orijinal veriden kırmızı çıkardığı sonucu görüyorsunuz. Yeşil ve kırmızı eğriler neredeyse aynıdır.

x = yük ('data.txt'); Filtrelenecek verilerin yüzdesi
h_lp = köknar1 (100, .3); % LP dürtü yanıtı
h_hp = köknar1 (100, 0,3, 'yüksek'); % HP dürtü yanıtı
y = filtrelenmiş (h_lp, 1, x); % düşük geçiş filtresi uygula
yh = filtrelenmiş (h_hp, 1, x); % yüksek geçiren filtre uygula
yd = x - yh; Yüksek geçiren filtre ile fark bazında% düşük geçiş
n = 1: uzunluk (x);
arsa (n, x, n, Y ', örn., N, yd, 'r')
eksen ([3500,4000,140,150])

resim açıklamasını buraya girin


Bu şekilde bir yüksek geçiren filtre tasarlamaya çalışıyorsanız, düşük geçiren filtrenin teknik özelliklerine dikkat etmelisiniz. Düşük geçiş filtresindeki durdurma bandı zayıflaması genellikle yüksek geçişte küçük geçiş bandı dalgalanması sağlayacak kadar yüksektir, ancak LP filtresindeki geçiş bandı dalgalanması genellikle HP filtresinde yeterli durdurma bandı zayıflaması sağlamaz.
David

Detaylı cevap için teşekkürler. Birkaç şeyi temizledi.
Sabit Nokta

3

Ölçeklendirme ile ilgili:

Katsayıları toplarsanız, DC için büyüklük elde edersiniz. Bu nedenle, bu sayıları almanız mantıklıdır ( LP için , HP için ).10

Matt L. mükemmel cevap birinin yanında sadece ne o kullanıyor olarak adlandırılır işaret edebilir büyüklüğü tamamlayıcı yani doğrusal fazlı FIR filtreler için ortak olduğu filtreler,,

|HLP|+|HHP|=1

İki paralel allpass bölümünden filtre oluştururken ve çıkışları eklerken / çıkarırken, bunun yerine düşük geçiş / yüksek geçiş filtreleri güç tamamlayıcı olacaktır , yani,

|HLP|2+|HHP|2=1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.