Parks-McClellan 최적 FIR 필터 설계 알고리즘의 오픈 소스 구현은 어디서 얻을 수 있습니까?


20

배경 : 종종 고유 한 필터가 필요한 일종의 신호 처리 작업을 수행하고 있습니다. 일반적으로이 시점에서 MATLAB으로 이동하여 사용하여 새로운 고유 필터를 생성합니다 . MATLAB 함수는 해당 Parks-McClellan 알고리즘을 구현합니다. 이제 필터가 있고 필터를 하드 코딩 된 배열에 넣습니다. 그러나 이제는 하나의 시나리오에서만 작동하는 하드 코딩 된 필터가 있습니다.에프나는아르 자형()firpm()

문제 : 이제 신호 처리 문제를 해결하는 것이 가능하지만 매우 특정한 단일 샘플 속도 또는 특정 시나리오에 대해서만 가능합니다.

목표 : C 코드 또는 다른 언어에서 을 호출 하고 신호 처리 코드를보다 일반적인 것으로 만들고 싶습니다. 오픈 소스 구현을 찾을 수 없습니다 !에프나는아르 자형()firpm()

Parks-McClellan 최적 FIR 필터 설계 알고리즘 ( MATLAB의 의 오픈 소스 구현은 어디서 구할 수 있습니까 ?에프나는아르 자형()

  • 추신 : 나는 창이나 다른 것을 사용하여 필터를 다르게 디자인 할 수 있다는 것을 알고 있습니다 ... 의견에 자유롭게 언급하십시오. 그러나이 질문의 요점은 "다른 필터 설계 기법은 무엇입니까?" 요점은 VERY VERY 유용한 ... 또는 이와 유사한 오픈 소스 구현을 찾는 것입니다.에프나는아르 자형()

  • PPS 이 질문의 목표 중 하나는 먼저 Parks-McClellan 알고리즘이 코드를보고 어떻게 작동하는지 배우고 배경 이론을 읽을 계획입니다.


솔루션이 무료라는 것이 중요합니까? Matlab C API를 조사 했습니까?

2
가장 높은 우선 순위는 소스 코드를보고 싶습니다 (바람직하게는 포트란이 아니므로 눈을 찌를 필요가 없습니다). 나는 그것이 자유로 워야한다는 제한을 두지 않을 것입니다 (어쩌면 오픈 소스이지만 비 자유 소스 코드가있을 수 있습니다).
Trevor Boyd Smith

3
Matlab 컴파일러를 사용하여 Matlab을 컴파일 한 다음 Matlab 런타임을 사용하여 배포 할 수 있다는 것을 알고 있습니다. 기술적으로 고객은 Matlab 라이센스를 지불 할 필요가 없습니다. 또한 Matlab 엔진 (일명 C에서 Matlab API)을 알고 있습니다. 일반적으로 둘 다 사용할 수없는 임베디드 플랫폼에서 실행하기 때문에 둘 다 관련이 없습니다.
Trevor Boyd Smith

1
@TrevorBoydSmith 소스 코드를보고 싶기 때문에 type firpm.mMATLAB 을 사용해 보셨습니까 ? MATLAB의 함수 구현을 보여줍니다.
Lorem Ipsum

1
FIR 필터 설계는 신호 처리에 매우 유용하며 parks-mcclelan은 사소한 주제입니다. 그러나 나는 IMO가 dsp.stackexchange 전세에 적합하다는 주제에 대해 반복적으로 투표를 받고 있습니다. 당신의 downvotes를 설명하십시오.
Trevor Boyd Smith

답변:


5

다음 은 Remez 교환 알고리즘 의 LGPL 버전 입니다. 옥타브 코드는이 코드에서 파생 된 것 같습니다. Wikipedia 페이지 Parks McClellan 페이지 에서 링크되었습니다 .
원래 Janovetz 코드는 옥타브 호출이 없기 때문에 프로젝트에서 더 쉽게 사용할 수 있지만 remez.cc 파일의 버그 수정 또는 속도 향상에 대한 정보 는 옥타브 포지 svn 변경 로그 를 파는 것이 좋습니다. .


Janovetz 코드를 사용하는 것이 C이기 때문에 더 쉽다는 데 동의합니다. 또한 옥타브 구현의 변경 로그를 확인하는 것이 매우 영리하다는 데 동의합니다.
Trevor Boyd Smith

Janovetz 코드 IMO는 아마도 첫 번째 또는 두 번째 초안 일 것입니다. 그러나 Octave 코드와 같이 많이 사용되지는 않았습니다.
Trevor Boyd Smith

매우 중요한 참고 사항 : Janovetz 코드는 LGPL이므로 상업적인 환경에서 사용할 수 있습니다.
Trevor Boyd Smith

대답에서 첫 번째 링크는 그렇게 깨진 여기에 같은 구현이 사용되는 라이브러리에 대한 링크입니다.
Machta

11

MATLAB과 유사한 환경의 자유 소프트웨어 구현 인 GNU Octave에는 Parks-McClellan (Remez 교환 알고리즘이라고도 함)의 오픈 소스 구현이 있습니다. "remez"라는 함수 는 Octave-Forge 에서 호스팅되는 "signal"패키지 에 포함되어 있습니다. 패키지를 다운로드하면 알고리즘의 C ++ 구현 인 "remez.cc"를 찾을 수 있습니다.

Octave의 장점 중 하나는 MATLAB과 거의 호환되는 코드이므로 원하는 경우 쉽게 코드를 이식 할 수 있습니다. MATLAB에서 MEX 형식으로 제공되는 알고리즘의 구현을 엿볼 수있는 좋은 방법입니다.


"Parks-McClellan 알고리즘은 Remez 알고리즘 또는 Remez 교환 알고리즘의 변형으로, FIR 필터 용으로 특별히 설계되었으며 FIR 필터 설계의 표준 방법이되었습니다." 또한 SciPy에서 : docs.scipy.org/doc/scipy/reference/generated/…
endolith


2

여기에 C의 Parks McClellan 알고리즘에 대한 또 다른 소스가 있습니다.이 코드는 위에서 언급 한 SciPy 코드와 다릅니다.이 코드는 원래 69 개의 ​​goto 문 중 61 개가 제거되었다 (SciPy 코드는 여전히 약 37 개의 goto를 가짐). 또한 0으로 나누기가 발생할 수있는 3 곳에서 코드를 수정하고 대역 에지 값을 확인하는 추가 코드가 있습니다.

http://www.iowahills.com/A7ExampleCodePage.html


1

어쩌면 이미 알고 있지만 matlab이 있으면 matlab 코더를 사용하고 검사하려는 기능을 사용하는 간단한 함수를 만들 수 있습니다. 그런 다음 실행하고 작성된 C 코드를 확인하십시오. FFT와 QR 분해로 시도했지만 조금 지저분하지만 잘 이해할 수 있습니다.


1

다음은 "핵심"remez 알고리즘의 실제 Matlab 버전을 수행하는 논문입니다. "Remez 다중 교환 알고리즘의 독창적 인 아이디어에 따른 MATLAB 기반의 최적의 다중 대역 FIR 필터 설계 프로그램"-2011 IEEE 국제 회로 및 시스템 심포지엄 (ISCAS)-저자 (사라 마키 아산)

이 논문은 기본 알고리즘을 잘 설명합니다. 이 논문의 목적은 원래 Fortran 코드를 사용하지 않는 것이 었습니다.이 알고리즘은 알고리즘을 잘 설명하지 못하고 종종 다른 여러 언어로 직접 번역됩니다.

한 가지만 언급하겠습니다. 알고리즘의 핵심 아이디어 중 하나는 곡선을 맞추고 극한 점을 찾는 것입니다. 일반적으로 Lagrange Interpolation은이 아이디어를 설명하는 데 사용되지만 Lagrange Interpolation은 수치 특성이 좋지 않습니다. 원래 알고리즘에서 Lagrange Interpolation의 Barycentric 구현을 사용하면 Lagrangian 보간과 관련된 많은 함정을 피할 수 있습니다. 따라서 코드를 완전히 이해하려는 경우 Barycentric Interpolation을 찾아 볼 수 있습니다.


논문을 보면-Parks-McClellan 코드의 수정 된 버전입니다. 여전히 Remez 교환 알고리즘을 기반으로하지만 성능이 더 좋아지는 경향이 있으며 PM 알고리즘 (또는 Matlab의 구현)보다 훨씬 긴 필터를 설계 할 수 있습니다.
David

1

Matlab의 firpm과 Scipy.signal의 remez의 차이점에주의하십시오. 예를 들어,이 두 문장은 동일합니다.

% Matlab
firpm(10,[.2 .8],[1 1],'Hilbert')
# Python
from scipy.signal import remez

remez(11, [0.1, 0.4], [1], type='hilbert')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.