This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Tms320c5535ezdsp FIR滤波器设计请教

各位大大好:

       這次我想請教一下關於加入FIR濾波器的問題,希望能請各位不吝給予指導。

        我的電腦系統為: Wind7 SP1
        使用的板子為: tms320C5535 ezdsp 

        使用的CCS版本為: Code Composer Studio 6.2.0

我在使用FIR前,參考了以下範例:

      TI關翻關於C5000的設計範例中 Chapt6 的FIR範例

      http://e2e.ti.com/group/universityprogram/educators/w/wiki/2040.c5000-teaching-rom

     GitHub別人寫的程式:

     https://github.com/raulbehl/C5535-eZdsp

     https://github.com/erikpayerl/Digital-musical-effects-with-DSP/blob/master/FXxy_DSPc5535_code/src/uart_config.c

     https://github.com/zile4/DSP2-Z1                等等.....太多就列舉三個我看比較多的範例

因此經過精簡後我的主程式碼如下:

#include "stdio.h"
#include "ezdsp5535.h"
#include "ezdsp5535_i2c.h"
#include "aic3204.h"
#include "ezdsp5535_aic3204_dma.h"
#include "ezdsp5535_i2s.h"
#include "ezdsp5535_sar.h"
#include "fir.h"
#include "filter_coeff.h"
#include "string.h"

/* Frekvencija odabiranja */
#define SAMPLE_RATE 44100
#define GAIN 0

/* Niz za smestanje ulaznih i izlaznih odbiraka */
#pragma DATA_ALIGN(InputBufferL,4)
Int16 InputBufferL[AUDIO_IO_SIZE];
#pragma DATA_ALIGN(InputBufferR,4)
Int16 InputBufferR[AUDIO_IO_SIZE];

#pragma DATA_ALIGN(InputBufferMono,4)
Int16 InputBufferMono[AUDIO_IO_SIZE];
#pragma DATA_ALIGN(OutputBufferMono,4)
Int16 OutputBufferMono[AUDIO_IO_SIZE];

Int16 zHO0[AUDIO_IO_SIZE];
Int16 zHO1[AUDIO_IO_SIZE];

Int16 TempS0[AUDIO_IO_SIZE];
Int16 TempS1[AUDIO_IO_SIZE];

void stereoToMono(Int16* inputL, Int16* inputR, Int16* output, int size)
{
int i;
for(i = 0; i < size; i++)
{
output[i] = (inputL[i]>>1) + (inputR[i]>>1);
}
}

void main( void )
{
int i;
int state=1;

/* Inicijalizaija razvojne ploce */
EZDSP5535_init( );

/* Inicijalizacija kontrolera za ocitavanje vrednosti dugmeta*/
EZDSP5535_SAR_init();

/* Inicijalizacija veze sa AIC3204 kodekom (AD/DA) */
aic3204_hardware_init();

/* Inicijalizacija AIC3204 kodeka */
aic3204_init();

aic3204_dma_init();

/* Postavljanje vrednosti frekvencije odabiranja i pojacanja na kodeku */
set_sampling_frequency_and_gain(SAMPLE_RATE, GAIN);

/* Empty z buffers */

memset(zHO0, 0, AUDIO_IO_SIZE);
memset(zHO1, 0, AUDIO_IO_SIZE);

while(1)
{

// 接收音訊
aic3204_read_block(InputBufferL, InputBufferR);

// FIR濾波

fir_basic(InputBufferL, H0, zHO0, N_COEFF, AUDIO_IO_SIZE, TempS0);
fir_basic(InputBufferR, H1, zHO1, N_COEFF, AUDIO_IO_SIZE, TempS1);

//輸出音訊

//aic3204_write_block(TempS0, TempS1);

aic3204_write_block(InputBufferL, InputBufferR);
}

aic3204_disable();

SW_BREAKPOINT;
}

完成後我發現兩件很嚴重的事情~

1.當我讓濾波器運行卻不對他進行輸出(即單純只讓他程式空轉),我輸出的訊號改為原本就收錄進來的訊號(即 aic3204_read_block(InputBufferL, InputBufferR) ;收錄之訊號)

   DSP會釋放雜訊((但仍有音樂

   因此我的排錯順訊如下:

STEP1:拿掉濾波器FIR單純輸入輸出  ==>功能正常

STEP2:只加一個聲道的FIR(左或右皆嘗試過)  ==>功能正常

STEP3:檢查記憶體位置,查看是否有數據重疊  ==>檢查後沒有重疊也沒被任意覆蓋

STEP4:更換另一片相同型號的DSP版做檢查  ==>結果相同

STEP5:更換耳機跟音訊來源(從電腦變手機) ==>結果相同

     最後當我想可能是意外吧,又把左右聲道的FIR一起放上去時!!!!又發生噪音啦QAQ     

     因此我真的想不通想請教各位大大到底芳生了什麼事

2.我的FIR階數,當超過23階時運作就不正常((一樣會發出嚴重噪音

    我爬文找不到辦法,因此上來求救><


我的FIR程式如下:

Int16 fir_basic(Int16* input, Int16 *coeffs, Int16 *z, unsigned short order, unsigned short nx, Int16* output)
{
int i, n;
Int32 accum;
Int32 temp;
// int arr = malloc(i*sizeof(int));
// int arr1 = malloc(ii*sizeof(int));

for(i = 0; i < nx; i++)
{
for (n = order - 2; n >= 0; n--)
{
z[n] = z[n - 1];
}

z[0] = input[i];


/* calc FIR */
accum = 0;
for (n = 0; n < order; n++)
{
temp = (Int32)coeffs[n] >> 15;
temp = temp >> 15;
//accum += z[n];
accum += (temp * z[n]);
}

//output[i] = accum >> 10;

output[i] = accum;

}
return 0;
}