2011-11-08 5 views
1

AVR 마이크로 컨트롤러에서 디지털 링잉 필터를 코딩하려고하는데 고정 소수점 산술에서 상태 다이어그램을 구현하는 데 문제가 있습니다.C의 고정 소수점 디지털 링잉 필터

의 여기 -은 ([1/(F_s * D)] I는 T_c 대한 방정식 이상이어야한다고 생각 E는 ^) enter image description here

편집 : 여기에 대한 코드를 작성하려고하고있는 신호 흐름의 사진이다 내가 지금까지 가지고있는 것. 나는 고정 소수점이 2 개의 8 비트 부호있는 정수에 곱하기 부호를 붙이고 16 비트 부호있는 제품을 반환하는 smultfix라는 루틴을 가지고있다. F_c 및 T_c는 8 비트 부호있는 바이너리 분수입니다. "출력"과 T_c의 입력과 지연 요소의 접합부에서 중간 단계 인 z1은 16 비트 2 진수로 처리됩니다. 그래서 나는이 :

이 코드 내 출력을 채우고 쓰레기를 많이 생성으로

int8_t generateSample() 
{ 
    static int16_t z1 = 0x7FFF; //initialize first delay element to max positive value 
    static int16_t output; 
    int8_t byteOutput = 0; 
    int8_t bytez1 = 0; 

    bytez1 = (z1 & 0xFF00)>>8; //make z1 into an eight bit signed binary fraction for  
           //multiplication 

    output = (smultfix(bytez1,F_c)<<1) + output; //calculate output, shift product 
               //left once to 
               //remove double sign bit 

    byteOutput = (output & 0xFF00)>>8;   //generate output byte 

    z1 = (-(smultfix(byteOutput,F_c)<<1)) - \ 
      (smultfix(bytez1,T_c)<<1) //generate intermediate     
                  //product z1 
    return byteOutput; 
} 

은 불행히도, 난, 그냥 가난한 난수 발생기를 만든 것 같다 (F_c 및 T_c 다른 곳에서 정의 된 것으로 가정) 완충기! 누군가 내가 잘못 될 수있는 곳을 지적하거나 더 나은 구현 아이디어가 있다면 많은 도움이 될 것입니다.

+0

smultfix의 출력을 시프트하면 부호 비트가 손실됩니다. –

+0

@BrettHale 승수와 피승수를 부호있는 이진 분수로 처리하는 경우, 곱하면 두 개의 부호 비트가 생깁니다. 맞습니까? 그래서 하나 빼야 해, 응? – Bitrex

답변

1

코드가 실제로 맞습니다. 그러나 T_c에 대한 공식의 부호는 실제로는 음수가 아닌 양수이되어야합니다. 이 책의 첫 번째 버전에서 음수로 표시되며이 이미지는 두 번째 책에서 가져온 것입니다.이 책에서는 방정식이 수정되었습니다. 기하 급수적으로 T_c를 계산하면 진동이 증가하지만 양수이면 진동이 줄어들어 원하는 결과를 얻을 수 있습니다. T_c가 음수이고 두 번째 줄부터 마지막 ​​줄까지 뺄셈의 부호가 바뀌면 작동합니다.

+0

문제가 해결되면이 대답에 동의로 표시하십시오. – MByD

관련 문제