2008-08-30 44 views

回答

18

百科:

這些 「高」, 「低」,以及 「帶」 的術語是指頻率。在高通中,您嘗試去除低頻。在低通中,您嘗試刪除高位。帶通中,您只允許保持連續的頻率範圍。

選擇截止頻率取決於您的應用。對這些濾波器進行編碼既可以通過模擬RC電路來完成,也可以通過對基於時間的數據進行傅立葉變換來完成。有關代碼示例,請參閱wikipedia文章。

5

它們通常是傾向於傳遞部分模擬信號的電路。高通傾向於傳輸更多的高頻部分,而低通傾向於傳遞更多的低頻部分。

它們可以用軟件模擬。例如,步行平均值可以用作低通濾波器,而步行平均值和輸入值之間的差值可以用作高通濾波​​器。

5

高通濾波器 - 頻率(詳細/本地信息)
低通過濾器讓 - 頻率(粗/粗/全球信息)

27

這裏是你使用卷積如何實現低通濾波器:

double[] signal = (some 1d signal); 
double[] filter = [0.25 0.25 0.25 0.25]; // box-car filter 
double[] result = new double[signal.Length + filter.Length + 1]; 

// Set result to zero: 
for (int i=0; i < result.Length; i++) result[i] = 0; 

// Do convolution: 
for (int i=0; i < signal.Length; i++) 
    for (int j=0; j < filter.Length; j++) 
    result[i+j] = result[i+j] + signal[i] * filter[j]; 

注意,例如被極度簡化。它不會進行範圍檢查,也不會正確處理邊緣。使用的濾波器(box-car)是一個特別糟糕的低通濾波器,因爲它會導致很多僞像(振鈴)。閱讀濾波器設計。

您也可以在頻域中實現濾波器。下面介紹如何使用FFT實現高通濾波器:

double[] signal = (some 1d signal); 
// Do FFT: 
double[] real; 
double[] imag; 
[real, imag] = fft(signal) 

// Set the first quarter of the real part to zero to attenuate the low frequencies 
for (int i=0; i < real.Length/4; i++) 
    real[i] = 0; 

// Do inverse FFT: 
double[] highfrequencysignal = inversefft(real, imag); 

此外,這是簡化的,但您明白了。代碼看起來不像數學那麼複雜。

+2

非常酷的代碼示例。爲什麼在一種情況下卷積和FFT在另一種情況下? – dfrankow 2009-03-13 19:03:28

+2

@dfrankow沒有特別的理由。只是爲了展示它在不同領域的外觀。更新了文字以反映這一點。謝謝。 – Hallgrim 2009-03-16 21:31:43

5

過濾描述了處理數據的行爲,這種處理方式對數據中的不同頻率應用不同級別的衰減。

高通濾波器對高頻應用最小衰減(即保持電平不變),但對低頻應用最大衰減。

低通濾波器是相反的 - 通過對高頻進行衰減,它不會對低頻施加衰減。

有許多不同的過濾算法被使用。最簡單的兩個可能是有限脈衝響應濾波器(又名FIR濾波器)和無限脈衝響應濾波器(又名IIR濾波器)。

FIR濾波器的工作原理是保持一系列樣本並將每個樣本乘以固定係數(基於系列中的位置)。每個這些乘法的結果都是累積的,並且是該樣本的輸出。這被稱爲Multiply-Accumulate - 在專用的DSP硬件中,有一個特定的MAC指令可以做到這一點。

當下一個採樣被添加到系列的開始時,系列中最舊的採樣被刪除,並重復該過程。

濾波器的行爲是通過選擇濾波器係數來確定的。

圖像處理軟件經常提供的一種最簡單的過濾器是平均過濾器。這可以通過將FIR濾波器的所有濾波器係數設置爲相同的值來實現。

5

這裏是在C++中的低通濾波器,其在一個時間處理該信號一個樣本的超簡單的例子:

float lopass(float input, float cutoff) { 
lo_pass_output= outputs[0]+ (cutoff*(input-outputs[0])); 
outputs[0]= lo_pass_output; 
return(lo_pass_output); 
} 

這裏是幾乎同樣的事情,除了它的高通:

float hipass(float input, float cutoff) { 
hi_pass_output=input-(outputs[0] + cutoff*(input-outputs[0])); 
outputs[0]=hi_pass_output; 
return(hi_pass_output); 
}