2014-11-24 4 views
0

저는 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 초 이상 실행하려고하면 실패합니다. 응용 프로그램은 모든 것을 기록하지만 재생시 충돌합니다. 필터를 제거하면 응용 프로그램이 작동합니다.

어떤 조언이 필요합니까?

+0

당신이 필요로 무엇을 얻을하지 않습니다 경우'(i 서 %의 SAMPLE_RATE == 0) ...'또한 실온에서 연속 샘플링을 수행 할 또는 샘플을 먼저 샘플링 한 다음 필터링 하시겠습니까? 첫 번째 옵션에 대해서는 모든 샘플을 필터링하지 말고 새로 추가 한 샘플 만 필터링해야합니다 ... 또한 'i-1','i'를 사용하여 필터링하고 있으므로 for 루프에'i -'가 있어야합니다. (당신이 사용하기 전에'i-1' 항목에 영향을줍니다 ... – Spektre

+0

실시간으로 작동하는 필터를 만들려고합니다. 그래서 계속 샘플링 할 필요가 있습니다. 매초마다 44100 번 컷오프를 변경하고 싶습니다. – boortmans

+0

추가 답변 ... 5 초 후 가장 중요한 문제는 사용 가능한 영역에서 컷오프 값입니다 (음수) – Spektre

답변

1

문제 :

  1. 당신이 i%SAMPLE_RATE == 0

    • 당신이 제로
    • 이하로 너무 멈추지 않을 400 Hz에서 매번에 의해 차단 주파수를 하향 조정이 초에 한 번씩 수행되지 않습니다 !!!
    • 대신 때마다 데이터의 두 번째 장벽을 통과하기위한 다음 코드에서 볼 수 없습니다 바로 이곳
    • 에서 통화를 호출하지 않으면 당신이 생각하는 더 자주 발생할 수 있습니다
  2. 당신을 의미

    • ... a[i]=f(a[i],a[i-1]; i++;
    • 이 filte있는 잘못된 oorder에서 필터링되어 이미 필터링 a[i-1] 값이 반지는

  1. 검사와 sompling 수행 패킹에 같은

    • 는 어떤 경우에해야 코드 배치를해야 할 일
    • 또는 일부 후 스레드에 Sleep(...); (또는 내부 타이머)
    • 변화는 방향 (에지 경우를 처리)이 같은

뭔가

  • 역 필터를 변경 차단 : 경우

    int i_done=0; 
    
    void on_some_timer() 
    { 
    cutoff-=400; 
    if (cutoff<1) cutoff=1; // here change 1 for limit frequency 
    
    if (numSamples!=i_done) 
        for (i=numSamples-1,i>=i_done;i--) 
        data.recordedSamples[i] = data.recordedSamples[i-1] + (filter(cutoff)*(data.recordedSamples[i] - data.recordedSamples[i-1])); 
    i_done=numSamples; 
    } 
    

    당신의 코드는 이미 괜찮습니다 (무언가를 놓칠 수 있도록 모든 것을 게시하지 않았습니다)

    • 그럼 그냥 컷오프 변경 후 if (cutoff<1) cutoff=1;를 추가
  • +0

    내 배열에 오디오 샘플이 가득차면 , 타이머를 시작하고 배열을 반복해야하고 시간 제한이 발생하면 컷오프를 변경 하시겠습니까? – boortmans

    +0

    'cutoff- = cutoff-400;은'cutoff = 400;과 같습니다. – mch

    +0

    @mch heh yep (복사 오류 thx 그것을 알아내는 것) – Spektre

    관련 문제