各位好,我是 音頻的初學者。
我使用 TMS320F28335 進行學習,使用 Mcbsp 與 aic23 通訊,使用中斷採集聲音並輸出。
以下是我的程式碼:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include <stdio.h>
#include <stdlib.h>
#include "dsp.h"
#include "fpu_cfft.h"
#include "fpu_rfft.h"
#include "math.h"
#include "AIC.h"
#include "fpu_fft_hamming.h"
#pragma DATA_SECTION(buffer_pink, "FFT_buffer_pink_1")
#pragma DATA_SECTION(buffer_ponk, "FFT_buffer_ponk_1")
#pragma DATA_SECTION(ring_buffer, "FFT_buffer1")
#pragma DATA_SECTION(output, "FFT_buffer_2")
// CFFT_F32_STRUCT object
CFFT_F32_STRUCT cfft;
// Handle to the CFFT_F32_STRUCT object
CFFT_F32_STRUCT_Handle hnd_cfft = &cfft;
//STAGE -> log(buf_size / 2)
#define true 1
#define false 0
#define buf_size 256
#define FFT_STAGES 7
#define RING_BUFFER
#ifdef RING_BUFFER
float ring_buffer[2560];
unsigned int ring_gap;// equal to buf_size
unsigned int ring_steps;
unsigned int ring_size;
unsigned int ring_head;
unsigned int ring_tail;
#endif
float input[buf_size] = {0};
float buffer_pink[buf_size] = {0};
float buffer_ponk[buf_size] = {0};
float output[buf_size] = {0};
float Mag[buf_size/2];
float Phase[buf_size/2];
float win[buf_size/2] = HAMMING256;
int R_count = -1;
float* p_temp;
int first_audio = 0, FFT_flag = 1,Process_Flag = 1;
unsigned int flag_2 = 0;
void fft(float*);
interrupt void ISRMcbspSend();
interrupt void ISRMcbspReceive();
/*******************************************************************************
* 滲 杅 靡 : main
* 滲杅髡夔 : 翋滲杅
* 怀 : 拸
* 怀 堤 : 拸
*******************************************************************************/
void main()
{
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitMcbspaGpio(); //zq
InitI2CGpio();
I2CA_Init();
InitMcbspa(); // Initalize the Mcbsp-A
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.MRINTA = &ISRMcbspReceive;
EDIS; // This is needed to disable write to EALLOW protected registers
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER6.bit.INTx5=1; // Enable PIE Group 6, INT 5 Receive
IER |= M_INT6; // Enable CPU INT6
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
#ifdef RING_BUFFER
ring_gap = buf_size;
ring_steps = (1+9);
ring_size = ring_gap*ring_steps;
ring_head = ring_gap*(1+0);//n=0: PinkPonk, n bigger = latency bigger. just for test.
ring_tail = 0;
#endif
CFFT_f32_setTwiddlesPtr(hnd_cfft, CFFT_f32_twiddleFactors);
CFFT_f32_setStages(hnd_cfft, (FFT_STAGES));
CFFT_f32_setFFTSize(hnd_cfft, (buf_size/2));
while(1)
{
if(FFT_flag && first_audio)
{
fft( (ring_buffer+ring_tail) );
FFT_flag = false;
}
}
}
void fft(float *buffer)
{
int i;
// float alpha = 0.1;
// for(i = 0; i < buf_size; i++)
// {
// if (i == 0) {
// buffer[i] = input[i];
// } else {
// buffer[i] = alpha * input[i] + (1 - alpha) * buffer[i - 1];
// }
// }
CFFT_f32_setInputPtr(hnd_cfft, buffer);
CFFT_f32_setOutputPtr(hnd_cfft, output);
// RFFT_f32_win(buffer, (float *)win, buf_size);
CFFT_f32t(hnd_cfft); // Calculate FFT
CFFT_f32_unpack(hnd_cfft);
#if 0
p_temp = CFFT_f32_getCurrInputPtr(hnd_cfft);
CFFT_f32_setCurrInputPtr(hnd_cfft, CFFT_f32_getCurrOutputPtr(hnd_cfft));
CFFT_f32_setCurrOutputPtr(hnd_cfft, Mag);
CFFT_f32_mag(hnd_cfft);
CFFT_f32_setCurrOutputPtr(hnd_cfft, Phase);
CFFT_f32_phase(hnd_cfft);
for(i = 0;i<buf_size/2;i++)
{
Mag[i] /= buf_size;
if(i > 0)
Mag[i] *= 2;
}
#endif
if(FFT_flag)
{
// buffer[2 * NHZ] = buffer[2 * NHZ + 1] = buffer[buf_size - 2 * NHZ] = buffer[buf_size - 2 * NHZ - 1] = 0;
}
CFFT_f32_setCurrInputPtr(hnd_cfft, buffer);
CFFT_f32_setCurrOutputPtr(hnd_cfft, output);
CFFT_f32_pack(hnd_cfft);
if((FFT_STAGES) % 2 == 0)
{
p_temp = CFFT_f32_getCurrOutputPtr(hnd_cfft);
CFFT_f32_setInputPtr(hnd_cfft, p_temp);
p_temp = CFFT_f32_getCurrInputPtr(hnd_cfft);
CFFT_f32_setOutputPtr(hnd_cfft, p_temp);
}
ICFFT_f32t(hnd_cfft);
for(i = 0; i < buf_size; i++)
buffer[i] = round(buffer[i]);
memcpy(output, buffer, sizeof(float) * buf_size);
first_audio = true;
}
interrupt void ISRMcbspReceive(void)
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;
int temp1;
temp1=McbspaRegs.DRR1.all;
if(Process_Flag == 0)
{
McbspaRegs.DXR1.all = temp1;
return;
}
if(first_audio)
{
if(!FFT_flag)
{
int a1,a2;
a1 = a2 = output[R_count];
if(output[R_count] < 0)
{
a1 &= 0xFF;
a2 = (a2 & 0xFF00) >> 8;
McbspaRegs.DXR1.bit.LWLB = a1;
McbspaRegs.DXR1.bit.LWHB = a2;
}
else
{
McbspaRegs.DXR1.all = output[ring_head % ring_gap];
McbspaRegs.DXR2.all = 0;
}
}
else
{
McbspaRegs.DXR1.all = 0;
McbspaRegs.DXR2.all = 0;
}
}
#ifdef RING_BUFFER
if(flag_2++ % 2 == 0)//skip one channel
{
*(ring_buffer + ring_head) = temp1;
ring_head = (ring_head+1) % ring_size;
if (ring_head%ring_gap == 0) {
first_audio = true;
if(FFT_flag == false)
{
ring_tail = (ring_tail + ring_gap) % ring_size;
}
FFT_flag = true;
}
}
#endif
}
interrupt void ISRMcbspSend(void)
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;
}
aic23 sample Rate 採44.1k。
我輸入 1k sin wave 進行測試,以下是我的 output 波形。

波形與輸出聲音都很粗糙、殘破。
煩請幫忙查看是哪出問題了。