본문 바로가기

CMSIS DSP

FIR Lowpass Filter Example

CMSIS FIR 필터 함수 예제입니다. 입력 신호는 1KHz15KHz 주파수가 섞여 있고 노이즈는 없는 신호입니다. 그리고 데이터는 48KHz로 샘플링된 데이터입니다. CMSIS FIR 함수를 6KHz Low Pass Filter (LPF)로 만들어 예제 샘플링 데이터의 1KHz 성분만 필터링합니다. 여기서 신호를 그래픽으로 확인할 수 있고, 저도 arm_cfft_f32 함수와 arm_cmplx_mag_f32 함수를 사용해서 확인해 봤습니다.



FFT Size가 작아서 그런지 예제 설명과 약간 다릅니다. 1KHz가 아닌 941KHz가 나타났습니다. FFT Size가 256이고 bin 인덱스 1당 주파수 간격은 188Hz(48KHz/255)입니다. 따라서 인덱스5가 인덱스6보다 1KHz에 더 가깝기는 합니다.


CMSIS FIR 모듈은 arm_common_tables.h에 이미 만들어진 인스턴스를 사용하는 FFT 모듈과 달리 직접 arm_fir_instance_f32 타입의 인스턴스를 만들어서 사용해야 합니다. 이 인스턴스는 arm_fir_init_f32 함수를 사용하여 초기화해야 하며, 이때 FIR 필터 계수를 입력해야 합니다. 이 계수는 매트랩의 fir1 함수를 사용하여 생성할 수 있습니다. fir1 함수를 사용하면 Low Pass Filter 계수 뿐만 아니라 High Pass Filter, Low Pass Filter, 다중 Band Pass Filter 계수도 만들 수 있습니다.


그리고 실제 필터링을 수행하는 arm_fir_f32 함수는 FIR 인턴스를 초기화할 때 입력한 블록 사이즈씩 연산을 수행합니다. 즉 버퍼 크기가 256이고 블록 사이즈가 32이면 arm_fir_f32 함수를 8번 돌려야 합니다. 그 결과와 FFT를 수행한 결과는 아래와 같습니다. 예제의 원래 샘플링 데이터는 320개인데, FFT 함수와 연계시키기 위해 64개 데이터를 버리고 테스트했습니다. 어차피 결과는 같습니다. 또한 arm_fir_f32 함수는 입력, 출력 버퍼를 구분합니다. 그리고 허수를 다루지 않으므로 입력 버퍼에 패딩(0.0f) 영역이 없으며, 입력, 출력 버퍼의 크기가 같습니다.


이 포스트에 나와 있는 FFT 결과는 원래 예제에 없고 제가 따로 추가한 것입니다. 즉, FIR 모듈은 FFT 모듈과 달리 주파수 분석 단계를 거치지 않습니다.