各位大大好:
這次我想請教一下關於加入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/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程式如下: