Filtrelemeyi çarpma veya katlama olarak uygulamak sayısal olarak daha kararlı mıdır?


12

Ben bir beşinci dereceden Butterworth filtre çevrimdışı ile 20.000 örnek bir sinyal filtre için bir program yazıyorum. Bir FFT uygulamasına erişimim var. Filtrelemeyi uygulamak için iki alternatif var gibi görünüyor:

  • sinyalin zaman alanındaki dürtü yanıtı ile kıvrılması veya
  • sinyalin frekans alanındaki dürtü yanıtı ile çarpılması ve sonucun ters çevrilmesi

Bu yöntemler teorik FT durumunda aynı olacaktır. Bununla birlikte, DFT ile gerçek hayatta yapmak, her şeyin farklı olduğunu düşünüyorum. Yöntemlerden biri sayısal olarak daha kararlı mı? Dikkat etmem gereken başka sorunlar var mı? Hesaplama sayısı önemli değildir.


Çoğu sinyal uzunluğu için FFT yönteminin hesaplanması çok daha hızlı olacaktır. Zaman alanlı evrişim ile sadece kısa uzunluklar daha hızlıdır.
endolith

Yanıtlar:


5

Evrişim ile, herhangi bir kararlılık problemi yaşamayacaksınız, çünkü özyinelemeli filtreleme yok, bu yüzden herhangi bir hata biriktirmeyeceksiniz. Başka bir deyişle, sistemin tümü sıfırdır, kutup yoktur. Anekdotsal olarak duydum, ancak kendim için doğrulanmadım, FFT tabanlı evrişimin, zaman alanı evrişiminden daha düşük bir hataya sahip olduğunu, çünkü O (n ^ 2) yerine O (n log n) aritmetik işlemlere sahip olduğundan.

Tipik olarak, bildiğim kadarıyla, Butterworth filtreleri özyinelemeli (IIR) filtreler olarak uygulanır, bu yüzden farklı bir konudur. IIR filtrelerinin sıfırların yanı sıra kutupları da vardır, bu nedenle uygulamada kararlılık sorunları olabilir. Ayrıca, IIR filtreleri için, FFT tabanlı yöntemler bir seçenek değildir, ancak tersine, IIR filtreleri çok düşük sıralı olma eğilimindedir.

IIR filtreleriyle ilgili kararlılık sorunları söz konusu olduğunda, daha yüksek siparişlerde sorun yaşama eğilimindedirler - sadece bir sayı atacağım ve kabaca 6. sıra ittiğini söyleyeceğim. Bunun yerine, bunlar tipik olarak kademeli çiftler halinde uygulanır (2. dereceden filtre bölümleri). 5. derece filtreniz için, bunu bir z-domain transfer fonksiyonu olarak yazın (5. derece rasyonel fonksiyon olacaktır) ve daha sonra 5 kutbuna ve 5 sıfırına çarpar. Karmaşık eşlenikleri toplayın, iki adet çiftli ve bir adet birinci dereceden filtreye sahip olacaksınız. Genel olarak, kutuplar birim daireye yaklaştıkça stabilite sorunları ortaya çıkma eğilimindedir.

IIR filtrelerinde gürültü ve sınır döngüleri ile ilgili sorunlar da olabilir, bu nedenle farklı sayısal özelliklere sahip farklı filtre topolojileri (yani doğrudan form I, doğrudan form II) vardır, ancak bu noktayı fazla düşünmezdim - sadece çift kullanın hassasiyet ve neredeyse kesinlikle yeterince iyi olacak.


Sadece FIR filtrelerinde çalışmakla ne demek istiyorsun? Yine de IIR filtrelerinin bir şekilde örneklenmesi gerektiğini varsaydım. Bunu önlemek için IIR filtreleri genellikle zaman alanında uygulanır mı?
Andreas

1
Bildiğim kadarıyla, IIR filtreleri her zaman zaman alanında uygulanır. Bir IIR filtresi (burada, örneğin, ikinci dereceden bir filtre veya "biquad") gibi bir fark denklemi ile tanımlanır y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2). Bunun, önceki girdi örneklerinin (x değerleri) ve önceki çıktı örneklerinin (y değerleri) birleşimi olduğunu unutmayın. FIR filtresi yalnızca geçmiş girdilere bağlıdır, bu nedenle verimli bir frekans etki alanı uygulamasını kabul eder. Bir IIR filtresi yoktur, ancak yine de çok verimlidir çünkü IIR filtreleri çok daha düşük sırada olma eğilimindedir.
schnarf

1
IIR filtrelerinin çok daha düşük sıralı olma eğiliminin nedeni, kutupların (önceki çıktı örneklerinin geri bildirimi), filtrenin bir FIR filtresine kıyasla çok az katsayıyla çok daha dikleşmesine izin vermesidir. Çok daha düşük sıra dediğimde, tipik bir IIR filtresi ikinci sıra (5 katsayı) olabilirken, aynı görev için tipik bir FIR filtresinde binlerce katsayı olabilir.
schnarf

4

Hemen hemen her durumda en iyi seçiminiz ne kıvrım ne de FFT'dir, ancak IIR filtresini doğrudan uygulamaktır (örneğin sosfilt () işlevini kullanarak). Bu, CPU ve bellek tüketimi açısından çok daha verimli olacaktır.

Sayısal bir fark yaratıp yaratmadığı, ilgili filtreye bağlıdır. Bazı farkların ortaya çıkabileceği tek durum, kutupların birim daireye çok, çok yakın olmasıdır. Hatta yardımcı olabilecek birkaç numara var. Aktarım işlevi gösterimini ve filter () KULLANMAYIN, ancak sosfilt () ile kutup ve sıfır kullanın. İşte fark için bir örnek.

n = 2^16;  % filter length
fs = 44100; % sample rate
x = zeros(n,1); x(1) = 1;
f0 = 15; % cutoff frequency in Hz
% design with poles and zeroes
[z,p,k] = butter(5,f0*2/fs);
clf
plot(sosfilt(zp2sos(z,p,k),x));
% design with transfer function
[b,a] = butter(5,f0*2/fs);
hold on
plot(filter(b,a,x),'k');

filter (), yaklaşık 15Hz @ 44.1kHz'lik bir kesimde bozulur. Sosfilt () için kesim, 44.1kHz Hz'in 1 / 100'ünün çok altında olabilir.

İstikrar problemleriniz varsa FFT de pek yardımcı olmaz. Filtreniz bir IIR filtresi olduğundan, dürtü yanıtı sonsuzdur ve önce kısaltılması gerekir. Bu çok düşük frekansta, dürtü yanıtı o kadar uzar ki FFT de pratik olmaz.

Örneğin, 1/100 Hz @ 44,1 kHz'de bir kesme ve 100 dB'lik dürtü yanıtında dinamik bir aralık istiyorsanız, yaklaşık 25 milyon örneğe ihtiyacınız var !!! Bu, 44.1 kHz'de neredeyse 10 dakika ve orijinal sinyalinizden çok daha uzun


Bu, sayısal problemler hakkındaki soruya gerçekten cevap vermiyor, ancak sorunların farkında değildim filter- teşekkürler! Yüksek geçişli kesimim 250 Hz'de 0,5 Hz. Sorunların sebebi nedir filter? Uygulamayı kendim yazıyorum.
Andreas

2

Neden bir şeyin farklı olacağını düşünüyorsunuz? Teorik kavramlar pratik uygulamalara dönüşmelidir, tek fark kaçamayacağımız kayan nokta meseleleridir. MATLAB'daki basit bir örnekle kolayca doğrulayabilirsiniz:

x=randn(5,1);
y=randn(5,1);
X=fft(x,length(x)+length(y)-1);
Y=fft(y,length(x)+length(y)-1);

z1=conv(x,y);z2=ifft(X.*Y);
z1-z2

ans =

   1.0e-15 *

   -0.4441
   -0.6661
         0
   -0.2220
    0.8882
   -0.2220
         0
   -0.4441
    0.8882

Gördüğünüz gibi, hatalar makine hassasiyeti düzeyindedir. FFT yöntemini kullanmamak için herhangi bir sebep olmamalıdır. Endolith'in belirttiği gibi, FFT yaklaşımını filtrelemek / bükmek / çapraz ilişkilendirmek vb. İçin çok daha yaygındır ve çok küçük örnekler dışında (bu örnekte olduğu gibi) çok daha hızlıdır. Zaman alanlı işleme asla yapılmaz ... hepsi uygulamaya, ihtiyaçlara ve kısıtlamalara dayanır.


1
Orijinal sorunun, FFT tabanlı filtrelemenin doğasında olan kayan nokta sorunlarına doğrudan zaman diliminde filtrenin doğrudan uygulanmasına sondaj olduğunu düşünüyorum. Bu, gerçekten uzun filtreleriniz varsa veya örneğin kötü bir FFT uygulamanız varsa, sabit nokta sinyal işleme için gerçek bir endişe kaynağı olabilir. Çift hassasiyetli kayan noktadaki 5 uzunluk dizileri için kesinlikle herhangi bir etki görmeyeceksiniz.
Jason R

@JasonR Sekansların uzunluğunu yukarıdaki örnekte 1e6'ya uzatırsanız hatalar hala makine hassasiyetindedir. Belirttiğiniz hatalar öncelikle zayıf filtre tasarımı veya kötü FFT uygulaması nedeniyle ortaya çıkar. Eğer bunlar iyi ise, zaman alanındaki konvolüsyonun neden frekans alanındaki cevaptan farklı bir cevap vermesi gerektiğini anlamıyorum.
Lorem Ipsum

1
Hesaplamaları yaptığınız etki alanına bağlı olarak farklı bir cevap vermemelidir. Tek amacım, gerçek matematiksel işlemlerin iki yaklaşım arasında büyük farklılıklar göstermesi, bu nedenle mevcut her birinizin uygulamalarına bağlı olarak, somut farklılıklar görebiliyordu. Çift hassasiyet için, iyi uygulamalarınız olduğunu varsayarsak, aşırı durumlar dışında herhangi bir fark beklemezdim.
Jason R
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.