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.

使用TMS28335 與 aic23 進行 FFT 處理,輸出聲音不正常。

Other Parts Discussed in Thread: TMS320F28335

各位好,我是 音頻的初學者。

我使用 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 波形。

波形與輸出聲音都很粗糙、殘破。

煩請幫忙查看是哪出問題了。