
Butterworth, RBJ, Chebychev 필터를 구현하고 Python (SCIPY)에 의해 생성 된 계수를 쉽게 가져올 수있는 Linux, Mac OSX 및 Windows 용 IIR (Infinite Impulse Response) 필터 라이브러리.
필터는 실시간 처리를 위해 샘플에 의해 데이터 샘플을 처리합니다.
템플릿을 사용하여 필요한 메모리를 할당하여 malloc / 새 명령없이 실행할 수 있습니다. 메모리 누출의 위험이없는 컴파일 시간에 메모리가 할당됩니다.
모든 실시간 필터 코드는 헤더 파일에 있으며 주 프로그램에 효율적인 통합을 보장하며 컴파일러는 필터 코드와 메인 프로그램을 동시에 최적화 할 수 있습니다.
코드에 다음 문을 추가하십시오.
#include "Iir.h"
일반적인 코딩 접근법은 먼저 필터가 순서를 지정하여 인스턴스화 된 다음 매개 변수가 함수 setup 으로 설정된 다음 샘플 실시간 필터링으로 샘플에 사용할 준비가되어 있다는 것입니다.
아이디어는 새로운 명령을 피하기 위해 템플릿 인수와 함께 컴파일 시간에 필터의 메모리를 할당하는 것입니다. 이것은 메모리 누출을 방지하고 컴파일 시간에 최적화 할 수 있습니다. 템플릿에 제공된 order (예 : 로우 패스 필터의 경우) :
Iir::Butterworth::LowPass<order> f;
아래 setup 명령에 따라 기본 순서로 사용되지만 필요한 경우 더 낮은 순서로 재정의 할 수 있습니다.
setup모든 필터는 로우 패드, 하이 패스, 대역 통과 및 밴드 스톱/노치 필터로 제공됩니다. Butterworth/Chebyshev는 정지 대역에서 지정된 통과 대역 게인 및 0dB 게인이있는 낮은/높은/밴드 껍질도 제공합니다.
주파수는 샘플링 속도에 대한 아날로그 일이거나 0..1/2 사이의 정규화 된 주파수 일 수 있습니다. 여기서 1/2은 Nyquist 주파수입니다. 정규화 된 주파수는 단순히 F = f/fs이며 1/샘플 단위입니다. 내부적으로 라이브러리는 정규화 된 주파수를 사용하며 설정 명령은 주어진 경우 샘플링 속도로 나뉩니다. 중 하나를 선택하십시오 :
setup : 샘플링 속도 및 아날로그 컷오프 주파수setupN : F = 0..1/2 사이의 1/샘플에서 정규화 된 주파수, 여기서 1/2 = nyquist. 기본적으로 setup 템플릿 인수에 의해 제공되는 순서를 사용하지만 더 낮은 필터 주문으로 재정의 할 수 있습니다.
iir 의 헤더 파일 또는 setup 명령의 인수는 문서를 참조하십시오.
아래 예제는 로우 패스 필터에 대한 것입니다.
Butterworth.h 표준 필터 대부분의 응용 프로그램에 적합합니다. 단조로운 반응. const int order = 4; // 4th order (=2 biquads)
Iir::Butterworth::LowPass<order> f;
const float samplingrate = 1000; // Hz
const float cutoff_frequency = 5; // Hz
f.setup (samplingrate, cutoff_frequency);
또는 0..1/2 사이의 정규화 된 주파수를 지정합니다.
f.setupN(norm_cutoff_frequency);
ChebyshevI.h . Iir::ChebyshevI::LowPass<order> f;
const float passband_ripple_in_db = 5;
f.setup (samplingrate,
cutoff_frequency,
passband_ripple_in_dB);
또는 0..1/2 사이의 정규화 된 주파수를 지정합니다.
f.setupN(norm_cutoff_frequency,passband_ripple_in_dB);
ChebyshevII.h 는 DB에서 최악의 허용 스톱 밴드 거부. Iir::ChebyshevII::LowPass<order> f;
double stopband_ripple_in_dB = 20;
f.setup (samplingrate,
cutoff_frequency,
stopband_ripple_in_dB);
또는 0..1/2 사이의 정규화 된 주파수를 지정합니다.
f.setupN(norm_cutoff_frequency,stopband_ripple_in_dB);
RBJ.h 컷오프 및 Q 팩터가있는 2 차 필터. Iir::RBJ::LowPass f;
const float cutoff_frequency = 100;
const float Q_factor = 5;
f.setup (samplingrate, cutoff_frequency, Q_factor);
또는 0..1/2 사이의 정규화 된 주파수를 지정합니다.
f.setupN(norm_cutoff_frequency, Q_factor);
Custom.h 로 필터 설계 ########
# Python
# See "elliptic_design.py" for the complete code.
from scipy import signal
order = 4
sos = signal.ellip(order, 5, 40, 0.2, 'low', output='sos')
print(sos) # copy/paste the coefficients over & replace [] with {}
///////
// C++
// part of "iirdemo.cpp"
const double coeff[][6] = {
{1.665623674062209972e-02,
-3.924801366970616552e-03,
1.665623674062210319e-02,
1.000000000000000000e+00,
-1.715403014004022175e+00,
8.100474793174089472e-01},
{1.000000000000000000e+00,
-1.369778997100624895e+00,
1.000000000000000222e+00,
1.000000000000000000e+00,
-1.605878925999785656e+00,
9.538657786383895054e-01}
};
const int nSOS = sizeof(coeff) / sizeof(coeff[0]); // here: nSOS = 2 = order / 2
Iir::Custom::SOSCascade<nSOS> cust(coeff);
샘플은 하나씩 처리됩니다. 아래의 예에서 샘플 x 는 filter 명령으로 처리 한 다음 y 로 저장됩니다. x 와 y 의 유형은 플로트 또는 이중 일 수 있습니다 (정수도 허용되지만 내부적으로 부동 소수점으로 처리됩니다).
y = f.filter(x);
그런 다음 루프 또는 이벤트 핸들러의 모든 들어오는 샘플에 대해 반복됩니다.
setup() 에 제공된 잘못된 값은 예외를 던집니다. setup() 에 제공된 매개 변수는 NAN 인 계수를 초래합니다.
CMAKE 또는 프로그램을 통해 IIR1_NO_EXCEPTIONS 정의하여 EXEPTION 처리를 전환 할 수 있습니다.
CMAKE를 빌드 시스템으로 사용하는 경우 CMakeLists.txt 동적 라이브러리의 경우 다음 줄에 추가하십시오.
find_package(iir)
target_link_libraries(... iir::iir)
또는 정적의 경우 :
find_package(iir)
target_link_libraries(... iir::iir_static)
동적 라이브러리 (Unix/Mac : -liir , Windows : iir.lib ) 또는 정적 라이브러리 (Unix/Mac : libiir_static.a , Windows : libiir_static.lib )에 연결하십시오.
Ubuntu LTS를 사용하는 경우이 라이브러리를 사전 컴파일 된 패키지로 설치할 수 있습니다.
이 저장소를 시스템에 추가하십시오.
sudo add-apt-repository ppa:berndporr/dsp
그런 다음 패키지를 설치하십시오.
sudo apt install iir1sudo apt install iir1-dev64 비트 인텔과 32,64 비트 암 (Raspberry Pi 등)에 사용할 수 있습니다. 개발 패키지 및 예제 프로그램의 문서는 다음과 같습니다.
/usr/share/doc/iir1-dev/
빌드 도구는 cmake 로, 다른 플랫폼에 대한 제작 또는 프로젝트 파일을 생성합니다. cmake Linux, Windows 및 Mac에서 사용할 수 있습니다. 또한 라즈베리 파이에서 직접 컴파일됩니다.
달리다
cmake .
makefile을 생성합니다. 그런 다음 실행 :
make
sudo make install
/usr/local/lib 및 /usr/local/include 에 설치합니다.
GCC와 Clang이 모두 테스트되었습니다.
cmake -G "Visual Studio 16 2019" -A x64 .
다른 빌드 옵션은 cmake 참조하십시오. 위는 64 비트 빌드입니다. 그런 다음 Visual C ++를 시작하고 솔루션을 엽니 다. DLL과 LIB 파일이 생성됩니다. Windows에서는 정적 라이브러리를 사용하여 응용 프로그램 프로그램에 연결하는 것이 좋습니다.
make test 또는 ctest 입력하여 단위 테스트를 실행하십시오. 델타 펄스 후 모든 필터가 0으로 완화되고 출력이 NAN이되지 않으며 직접 양식 I & II 필터가 Scipy의 sosfilt 의 출력으로 생성 된 결과에서 비교하여 예상 시퀀스를 계산하는 경우 이러한 테스트.
IIR1_BUILD_TESTING OFF로 설정하여 테스트 생성을 비활성화 할 수 있습니다.
가장 쉬운 방법은 demo 디렉토리에있는 예제입니다. 테스트 신호로서의 델타 펄스는 다른 필터로 전송되어 파일에 저장됩니다. Python script plot_impulse_fresponse.py 사용하면 주파수 응답을 플로팅 할 수 있습니다.
IIR1_BUILD_DEMO OFF로 설정하여 데모 컴파일을 비활성화 할 수 있습니다.
또한 단위 테스트를 포함하는 디렉토리는 모든 필터 유형에 대한 예제를 제공합니다.
모든 클래스, 메소드 및 특정 setup 기능의 PDF는 docs/pdf 디렉토리에 있습니다.
온라인 문서는 여기에 있습니다 : http://berndporr.github.io/iir1
이러한 응답은 /demo/ 디렉토리에서 iirdemo.cpp 에 의해 생성 된 다음 plot_impulse_fresponse.py 로 플롯 팅되었습니다.







이 라이브러리는 Vinnie Falco의 위대한 독창적 인 작품에서 여기에서 찾을 수 있습니다.
https://github.com/vinniefalco/dspfilters
원래 라이브러리 프로세스 오디오 배열이 라이브러리는 샘플별로 빠른 실시간 처리 샘플을 수행하도록 조정되었습니다. setup 명령에는 필터 순서가 필요하지 않고 대신 템플릿 인수에서 기억합니다. 클래스 구조는 단순화되었으며 독소에 대해 모든 기능이 문서화되었습니다. Assert () 진술을하는 대신이 libary는 매개 변수가 잘못된 경우 예외를 제외합니다. 최적화가 필요한 필터 설계 (예 : 타원 필터)가 제거되었으며 대신 Scipy에서 쉽게 계수를 가져올 수있는 기능이 추가되었습니다.
Bernd Porr -http://www.berndporr.me.uk