저는 PortAudio 라이브러리에서 로우 패스 필터를 구현하고 있습니다. PortAudio 자체의 스크립트로 마이크 입력을 녹음합니다. 여기에 다음 코드를 추가했습니다.C의 로우 패스 필터
float cutoff = 4000.0;
float filter(float cutofFreq){
float RC = 1.0/(cutofFreq * 2 * M_PI);
float dt = 1.0/SAMPLE_RATE;
float alpha = dt/(RC+dt);
return alpha;
}
float filteredArray[numSamples];
filteredArray[0] = data.recordedSamples[0];
for(i=1; i<numSamples; i++){
if(i%SAMPLE_RATE == 0){
cutoff = cutoff - 400;
}
data.recordedSamples[i] = data.recordedSamples[i-1] + (filter(cutoff)*(data.recordedSamples[i] - data.recordedSamples[i-1]));
}
이 스크립트를 5 초 동안 실행하면 작동합니다. 그러나 이것을 5 초 이상 실행하려고하면 실패합니다. 응용 프로그램은 모든 것을 기록하지만 재생시 충돌합니다. 필터를 제거하면 응용 프로그램이 작동합니다.
어떤 조언이 필요합니까?
당신이 필요로 무엇을 얻을하지 않습니다 경우'(i 서 %의 SAMPLE_RATE == 0) ...'또한 실온에서 연속 샘플링을 수행 할 또는 샘플을 먼저 샘플링 한 다음 필터링 하시겠습니까? 첫 번째 옵션에 대해서는 모든 샘플을 필터링하지 말고 새로 추가 한 샘플 만 필터링해야합니다 ... 또한 'i-1','i'를 사용하여 필터링하고 있으므로 for 루프에'i -'가 있어야합니다. (당신이 사용하기 전에'i-1' 항목에 영향을줍니다 ... – Spektre
실시간으로 작동하는 필터를 만들려고합니다. 그래서 계속 샘플링 할 필요가 있습니다. 매초마다 44100 번 컷오프를 변경하고 싶습니다. – boortmans
추가 답변 ... 5 초 후 가장 중요한 문제는 사용 가능한 영역에서 컷오프 값입니다 (음수) – Spektre