MATLAB에서 저역통과 필터 설계
이 예제에서는 저역통과 필터를 설계하는 방법을 보여줍니다. 이 예제는 DSP System Toolbox™에서 가장 일반적으로 사용되는 몇 가지 명령줄 툴을 보여줍니다. 또는 필터 작성기 앱을 사용하여 여기에 제시된 모든 설계를 구현할 수 있습니다. 추가 설계 옵션은 Design Lowpass FIR Filters 항목을 참조하십시오.
소개
저역통과 필터를 설계할 때 가장 먼저 해야 할 일은 FIR 필터를 설계할지, IIR 필터를 설계할지 선택하는 것입니다. 일반적으로 선형 위상 응답이 중요한 경우 FIR 필터를 선택합니다. 또한 FIR 필터는 일반적으로 양자화 효과에 대해 더 견고하기 때문에 고정소수점 구현에 선호됩니다. FIR 필터는 파이프라이닝에 적합하기 때문에 FPGA 또는 ASIC 같은 많은 고속 구현에도 사용됩니다. IIR 필터(특히 바이쿼드 필터)는 위상 선형성이 문제 되지 않는 응용 분야(예: 오디오 신호 처리)에 사용됩니다. IIR 필터는 일반적으로 FIR 필터보다 더 적은 계수로 설계 사양을 충족할 수 있다는 점에서 계산 효율이 더 높습니다. 또한 IIR 필터는 과도 응답이 짧고 군지연이 더 작습니다. 그러나 최소 위상과 멀티레이트 설계를 사용하면 군지연과 계산 효율성이 IIR 필터와 비슷한 수준인 FIR 필터를 얻을 수 있습니다.
FIR 저역통과 설계 - 필터 차수 지정
실제 상황에서 필터 차수를 지정해야 하는 경우가 많습니다. 그러한 사례 중 하나는, 필터 차수가 특정 값으로 제한된 하드웨어를 대상으로 하는 경우입니다. 또 다른 일반적인 시나리오는 구현에 사용 가능한 계산 버짓(MIPS)을 계산했을 때 필터 차수가 제한되는 경우입니다. Signal Processing Toolbox의 FIR 설계 함수(fir1
, firpm
, firls
등)는 모두 지정된 차수로 저역통과 필터를 설계할 수 있습니다. DSP System Toolbox에서 차수가 지정된 저역통과 FIR 필터를 설계할 때 선호되는 함수는 firceqrip
입니다. 이 함수는 지정된 통과대역/저지대역 리플 값과 통과대역 경계 주파수를 사용하여 최적의 등리플 저역통과/고역통과 FIR 필터를 설계합니다. 저지대역 경계 주파수는 설계 결과에 따라 결정됩니다.
48kHz로 샘플링된 데이터에 대한 저역통과 FIR 필터를 설계합니다. 통과대역 경계 주파수는 8kHz입니다. 통과대역 리플은 0.01dB이고 저지대역 감쇠량은 80dB입니다. 필터 차수를 120으로 제한합니다.
N = 120; Fs = 48e3; Fp = 8e3; Ap = 0.01; Ast = 80;
선형 단위로 통과대역 리플과 저지대역 리플의 최대 편차를 구합니다.
Rp = (10^(Ap/20) - 1)/(10^(Ap/20) + 1); Rst = 10^(-Ast/20);
firceqrip
를 사용하여 필터를 설계하고 크기 주파수 응답을 확인합니다.
NUM = firceqrip(N,Fp/(Fs/2),[Rp Rst],"passedge"); hFiltAnalyzer = filterAnalyzer(NUM,SampleRates=Fs,FilterNames="Num_120")
hFiltAnalyzer = filterAnalyzer with no properties.
결과로 생성되는 저지대역 경계 주파수는 약 9.64kHz입니다.
최소 차수 설계
최적의 등리플 필터를 설계할 수 있는 또 다른 함수는 firgr
입니다. firgr
은 통과대역/저지대역 리플 제약 조건과 지정된 천이 폭을 만족하면서, 가능한 최소 필터 차수로 필터를 설계할 수 있습니다. 예를 들어, 저지대역 경계 주파수를 10kHz로 지정하면, 결과로 생성되는 필터의 차수는 firceqrip
로 설계된 120차 필터가 아닌 100차가 됩니다. 천이 대역이 클수록 필터 차수가 작아집니다.
저지대역 경계 주파수를 10kHz로 지정합니다. 0.01dB의 통과대역 리플과 80dB의 저지대역 감쇠량을 갖는 최소 차수 FIR 필터를 구합니다.
Fst = 10e3; NumMin = firgr("minorder",[0 Fp/(Fs/2) Fst/(Fs/2) 1],... [1 1 0 0],[Rp,Rst]);
firgr
로 얻은 최소 차수 FIR 필터와 firceqrip
로 설계한 120차 필터의 크기 주파수 응답을 플로팅합니다. 최소 차수 설계는 차수가 100인 필터를 결과로 생성합니다. 120차 필터의 천이 영역은 예상대로 차수가 100인 필터보다 좁습니다.
hFiltAnalyzer.addFilters(NumMin,FilterNames="Num_minorder"); hFiltAnalyzer.setLegendStrings(["N = 120" "N = 100"]);
데이터 필터링
필터를 데이터에 적용하려면 filter
명령을 사용하거나 dsp.FIRFilter
를 사용할 수 있습니다. dsp.FIRFilter
는 루프에서 실행되면 상태를 관리할 수 있다는 장점이 있습니다. dsp.FIRFilter
는 고정소수점 기능도 있으며, C 코드 생성, HDL 코드 생성, ARM® Cortex® M과 ARM Cortex A에 최적화된 코드 생성을 지원합니다.
120차 FIR 저역통과 필터를 사용해, 평균이 0이고 단위 표준편차를 갖는 10초 길이의 백색 잡음을 256개 샘플로 구성된 프레임 단위로 필터링합니다. 스펙트럼 분석기에서 결과를 확인합니다.
LP_FIR = dsp.FIRFilter(Numerator=NUM); SA_FIR = spectrumAnalyzer(SampleRate=Fs,PlotAsTwoSidedSpectrum=false); tic while toc < 10 x = randn(256,1); y = LP_FIR(x); step(SA_FIR,y); end release(SA_FIR)
dsp.LowpassFilter
사용
firceqrip
와 firgr
을 dsp.FIRFilter
와 함께 사용하는 대신 dsp.LowpassFilter
를 사용할 수 있습니다. 기본적으로 dsp.LowpassFilter
는 두 단계의 프로세스를 한 단계로 압축합니다. dsp.LowpassFilter
는 고정소수점 지원, C 코드 생성 지원, HDL 코드 생성 지원, ARM Cortex 코드 생성 지원 측면에서 dsp.FIRFilter
와 같은 이점을 제공합니다.
48kHz로 샘플링된 데이터에 대한 저역통과 FIR 필터를 설계합니다. 통과대역 경계 주파수는 8kHz입니다. 통과대역 리플은 0.01dB이고 저지대역 감쇠량은 80dB입니다. 필터 차수를 120으로 제한합니다. 원하는 사양의 dsp.FIRFilter
를 만듭니다.
LP_FIR = dsp.LowpassFilter(SampleRate=Fs,... DesignForMinimumOrder=false,FilterOrder=N,... PassbandFrequency=Fp,... PassbandRipple=Ap,StopbandAttenuation=Ast);
LP_FIR
의 계수는 NUM
의 계수와 동일합니다.
NUM_LP = tf(LP_FIR);
앞의 예제와 같이 LP_FIR
을 사용하여 데이터를 직접 필터링할 수 있습니다. filterAnalyzer
를 사용하여 필터를 분석하거나 measure
를 사용하여 응답을 측정할 수도 있습니다.
hFiltAnalyzer.addDisplays(1); hFiltAnalyzer.addFilters(LP_FIR);
measure(LP_FIR)
ans = Sample Rate : 48 kHz Passband Edge : 8 kHz 3-dB Point : 8.5843 kHz 6-dB Point : 8.7553 kHz Stopband Edge : 9.64 kHz Passband Ripple : 0.01 dB Stopband Atten. : 79.9981 dB Transition Width : 1.64 kHz
dsp.LowpassFilter를 사용한 최소 차수 설계
dsp.LowpassFilter
를 사용하여 최소 차수 필터를 설계하고 measure
를 사용하여 설계가 미리 정해진 사양을 만족하는지 확인할 수 있습니다. 필터 차수는 다시 100입니다.
LP_FIR_minOrd = dsp.LowpassFilter(SampleRate=Fs,... DesignForMinimumOrder=true,... PassbandFrequency=Fp,... StopbandFrequency=Fst,... PassbandRipple=Ap,... StopbandAttenuation=Ast); measure(LP_FIR_minOrd)
ans = Sample Rate : 48 kHz Passband Edge : 8 kHz 3-dB Point : 8.7136 kHz 6-dB Point : 8.922 kHz Stopband Edge : 10 kHz Passband Ripple : 0.0098641 dB Stopband Atten. : 80.122 dB Transition Width : 2 kHz
Nlp = order(LP_FIR_minOrd)
Nlp = 100
IIR 필터 설계
타원 필터는 최적의 등리플 FIR 필터에 상응하는 IIR 필터입니다. 따라서 동일한 사양으로 타원 필터를 설계할 수 있습니다. IIR 필터에서 얻는 필터 차수는 상응하는 FIR 필터의 차수보다 훨씬 작습니다.
120차 FIR 필터와 동일한 샘플링 주파수, 차단 주파수, 통과대역 리플 제약 조건, 저지대역 감쇠량을 갖는 타원 필터를 설계합니다. 타원 필터의 필터 차수를 10으로 줄입니다.
N = 10; LP_IIR = dsp.LowpassFilter(SampleRate=Fs,... FilterType="IIR",... DesignForMinimumOrder=false,... FilterOrder=N,... PassbandFrequency=Fp,... PassbandRipple=Ap,... StopbandAttenuation=Ast);
FIR 설계와 IIR 설계를 비교합니다. 두 설계의 구현 비용을 계산합니다.
hFiltAnalyzer.addFilters(LP_IIR); hFiltAnalyzer.setLegendStrings(["FIR Equiripple, N = 120" "IIR Elliptic, N = 10"])
cost_FIR = cost(LP_FIR)
cost_FIR = struct with fields:
NumCoefficients: 121
NumStates: 120
MultiplicationsPerInputSample: 121
AdditionsPerInputSample: 120
cost_IIR = cost(LP_IIR)
cost_IIR = struct with fields:
NumCoefficients: 25
NumStates: 20
MultiplicationsPerInputSample: 25
AdditionsPerInputSample: 20
FIR 필터와 IIR 필터의 크기 응답은 유사합니다. IIR 필터의 비용은 FIR 필터 비용의 약 1/6입니다.
IIR 필터 실행
IIR 필터는 바이쿼드 필터로 설계되었습니다. 데이터에 필터를 적용하려면 FIR 필터에 사용한 것과 같은 명령을 사용합니다.
10차 IIR 저역통과 필터를 사용해, 평균이 0이고 단위 표준편차를 갖는 10초 길이의 백색 가우스 잡음을 256개 샘플로 구성된 프레임 단위로 필터링합니다. 스펙트럼 분석기에서 결과를 확인합니다.
SA_IIR = spectrumAnalyzer(SampleRate=Fs,PlotAsTwoSidedSpectrum=false); tic while toc < 10 x = randn(256,1); y = LP_IIR(x); SA_IIR(y); end release(SA_IIR)
가변 대역폭의 FIR 필터와 IIR 필터
런타임에 차단 주파수를 변경할 수 있는 필터를 설계할 수도 있습니다. 이러한 경우에는 dsp.VariableBandwidthFIRFilter
와 dsp.VariableBandwidthIIRFilter
를 사용할 수 있습니다.