⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 echo.c

📁 语音信号采集与分析 简单地讲
💻 C
字号:
/*																				*/
/*  Copyright 2004 by SEED Electronic Technology LTD.                           */
/*  All rights reserved. SEED Electronic Technology LTD.                        */
/*  Restricted rights to use, duplicate or disclose this code are               */
/*  granted through contract.    											    */
/*                                           									*/
/*  Authors: david																*/
/*  Data: 2006/10/28															*/
/********************************************************************************/
#include "type.h"
#include "codec.h"
#include "sysreg.h"
#include "mcbsp54.h"
#include "memory.h"

/********************************************************************************/
#define  AUDIOTRY      0xAA0A//音频试听
#define  AUDIOECHO    0xAA08//音频回声
//实验操控:
//选择TESTCOMMAND,1为试听;2为和声。
//选择CODECAGAIN,48-127之间。是调整增益的参数。
//最好在110-127之间,否则声音太小,难以听到。

#define TESTCOMMAND    2     //操作命令选择 
unsigned int  Command =0;
/********************************************************************************/
/*数据缓冲区的首址为0x8000,长度为0x8000*/

#pragma DATA_SECTION(DataBuffer,".Audio_data");
short DataBuffer[0x8000];
/////////////////////////////////////////////////////////////////////
HANDLE codec_command =0;
HANDLE codec_data=0;
/////////////////////////////////////////////////////////////////////
unsigned int audioleft,audioright;	
/*********************************************************************/
void echo();
/*********************************************************************/
main()
{	
	/*设置系统时钟*/
	sys_clk(CLK160);
#if TESTCOMMAND==1
	Command =AUDIOTRY;//试听 0xAA0A
#endif
#if TESTCOMMAND==2	
	Command =AUDIOECHO;//回声 0xAA08
#endif
	/*打开codec数据接口*/
	codec_data = codec_open(CODEC_DATA);
	/*打开codec命令接口*/
	codec_command = codec_open(CODEC_COMMAND);
	/*选择麦克风作为输入 0x14,选择Line in作为输入 0x12*/
	codec_analog_mode(codec_command,0x12);
	/*设置波特率,输入与输出均为8K*/
	codec_sample_rate(codec_command,0xd);
	
	/*配置系统存储器*/	
	memory_set(0x80);	
	
	//设置增益	
	codec_headhponeout_gain(codec_command,127);	
	for(;;)
	{	
		switch(Command)
		{
			/*音频试听*/
			case AUDIOTRY:
				while (!MCBSP_RRDY(CODEC_DATA)) {};
					audioleft = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
				while (!MCBSP_RRDY(CODEC_DATA)) {};
					audioright = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
				
				while (!MCBSP_XRDY(CODEC_DATA)) {};
					*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioleft;					
				while (!MCBSP_XRDY(CODEC_DATA)) {};
					*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioright;			
			break;					
			/*音频和声*/	
			case AUDIOECHO:
				echo();				
			break;							
			default:
			break;
		} 		
	}							     
}
/***********************************************************************************/
/*函数名:echo()																   */
/*	描述:																		   */
/*			使输入的音频具有合唱的效果											   */
/*	输入参数:																	   */
/*			int freq  : chorus's speed											   */
/*			int decay : chorus's deepth											   */
/*	返回值	:																	   */
/*			none																   */
/***********************************************************************************/
void echo()
{

    short uDelay=256,uEffect=256;
    short nWork,nWork1;
    int lpWork1;
    int lpWork;
    int luWork,luWork1;
    short fWork,fWork1;
    short nLoop ;
     
	lpWork=0; 
	luWork=0; 

   	uEffect%=1024;			// 保证输入在0-1023之间
    uDelay%=1024;			// 保证输入在0-1023之间
        
  	nLoop = 100;
    nLoop *= uDelay; 
	
    for ( luWork1=0;luWork1<0x8000;luWork1++ )
    	DataBuffer[luWork1] =0;
   
    do
    {
       	while (!MCBSP_RRDY(CODEC_DATA)) {};
			audioleft = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
		while (!MCBSP_RRDY(CODEC_DATA)) {};
			nWork = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
		// 保存到缓冲区
		DataBuffer[lpWork] =nWork;  
   		luWork1=luWork-nLoop;
       	if ( luWork1<0 )	
       		luWork1+=0x48000;
       		
       	lpWork1 = 0;
       	lpWork1 += luWork1;			// 根据uDelay参数计算
       	nWork1 = DataBuffer[lpWork1];	// 取得保存的音频数据   	

      	nWork1 /= 512;
       	nWork1 *= uEffect;
       	nWork += nWork1;	  // 与当前声音混响   

	     			
	   	while (!MCBSP_XRDY(CODEC_DATA)) {};
			*(volatile u16*)DXR1_ADDR(CODEC_DATA) = nWork;
		while (!MCBSP_XRDY(CODEC_DATA)) {};
			*(volatile u16*)DXR1_ADDR(CODEC_DATA) = nWork;
			
        luWork++;
 		lpWork++;						// 循环使用缓冲区
        if ( luWork>=0x8000 )
        {
        	luWork=0;
			lpWork=0;
        }
    } 
    while(Command==0xaa08);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -