2014-12-14 4 views
0

임베디드 디자인을 구현하려고합니다. 내 보드에서 u32 데이터를 수신하고 신호에 LPF를 추가하려고합니다. C 코드에 익숙하지 않기 때문에 지금 당장 붙어 있습니다. 튜토리얼을 따라 정적 데이터로 작동하는 고정 소수점 FIR에 대한 기본 사항을 얻었습니다.C의 실시간 저역 통과 필터

지금 나는 입력 장치에서 샘플을 가져 와서 샘플을 별도로 처리합니다. u32에서 int32_t 로의 캐스트가 있지만 실제로 무슨 일이 일어나는지 잘 모르겠습니다.

나를 올바른 방향으로 안내 할 수있는 사람은 누구입니까?

#define FILTER_LEN_LP 44 
int16_t coeffsLPF[ FILTER_LEN_LP ] = 
{ 
    87, 76, 106, 143, 185, 234, 289, 349, 
    414, 483, 555, 628, 701, 773, 842, 907, 
    966, 1017, 1060, 1093, 1115, 1126, 1126, 
    1115, 1093, 1060, 1017, 966, 907, 842, 773, 
    701, 628, 555, 483, 414, 349, 289, 234, 185, 
    143, 106, 76, 87 
}; 

void low_pass_filter(){ 
    u32 in_left; 

    int k = 0; 
    int filter_length = FILTER_LEN_LP; 
    u32 acc; // accumulator for MACs 
    u32 *coeffp; // pointer to coefficients 

    u32 out_left; 

    while (!XUartPs_IsReceiveData(UART_BASEADDR)) { 

     in_left = Xil_In32(I2S_DATA_RX_L_REG); 

     xil_printf("%d\n\r", in_left); 

     out_left = 1 << 29; 
     for (k = 0; k < filter_length; k++) 
     { 
      out_left += (int32_t)*coeffp++ * in_left; 
     } 

     // saturate the result 
     if (out_left > 0x3fffffff) 
     { 
      out_left = 0x3fffffff; 
     } else if (out_left < -0x40000000){ 
      out_left = -0x40000000; 
     } 

     xil_printf("%d\n\r", out_left); 

     //in_right = Xil_In32(I2S_DATA_RX_R_REG); 

     Xil_Out32(I2S_DATA_TX_L_REG, out_left); 


     //Xil_Out32(I2S_DATA_TX_R_REG, in_right); 

    } 
    // break 
    if(XUartPs_ReadReg(UART_BASEADDR, XUARTPS_FIFO_OFFSET) == 'q') menu(); 
    else low_pass_filter(); 
} 
+0

그리고 구체적으로 무엇이 문제인가? – wakjah

+0

신호가 실제로 필터링되지 않습니다. 나는 소음이 많다. 그러나 나는 어디를 먼저보아야할지 모르겠다. C에 대한 나의 지식은 매우 제한적이다. – boortmans

+0

@Barto 모든 경고가있는 코드를 컴파일하고 각 단일 경고를 처리하도록 적극 권장합니다. –

답변

1

계수 포인터를 읽지 않고 초기화되지 않았으므로 정의되지 않은 동작이 발생합니다. 이 경우 귀하의 프로그램이 계수에 대한 무작위 데이터를 읽는 것 같지만 무엇이든 일 수 있습니다.

내부 루프가 시작되기 전에 포인터를 재설정해야합니다. 예 :

void low_pass_filter(){ 
    // ... 
    u32 *coeffp; // pointer to coefficients 
    // ... 
    while (!XUartPs_IsReceiveData(UART_BASEADDR)) { 
     // ... 
     coeffp = coeffsLPF; // reset to coeffsLPF so that each sample input is multiplied by all of the coefficients 
     for (k = 0; k < filter_length; k++) 
     { 
      // ... 
관련 문제