AVR 마이크로 컨트롤러에서 디지털 링잉 필터를 코딩하려고하는데 고정 소수점 산술에서 상태 다이어그램을 구현하는 데 문제가 있습니다.C의 고정 소수점 디지털 링잉 필터
의 여기 -은 ([1/(F_s * D)] I는 T_c 대한 방정식 이상이어야한다고 생각 E는 ^) 는
편집 : 여기에 대한 코드를 작성하려고하고있는 신호 흐름의 사진이다 내가 지금까지 가지고있는 것. 나는 고정 소수점이 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 다른 곳에서 정의 된 것으로 가정) 완충기! 누군가 내가 잘못 될 수있는 곳을 지적하거나 더 나은 구현 아이디어가 있다면 많은 도움이 될 것입니다.
smultfix의 출력을 시프트하면 부호 비트가 손실됩니다. –
@BrettHale 승수와 피승수를 부호있는 이진 분수로 처리하는 경우, 곱하면 두 개의 부호 비트가 생깁니다. 맞습니까? 그래서 하나 빼야 해, 응? – Bitrex