📄 ulawde.c
字号:
/*************************************************************
*Copyright (c) 2005,北京精仪达盛科技有限公司研发部
*All rights reserved
*
*文件名称:ulawde.c
*文件标示:
*摘 要:本文件内容为tms320lf2407 dsp u律压缩、解压缩实验
* 程序
*
*当前版本:1.0
*作 者:王飞
*完成日期:2005年2月17日
*
*取代版本:
*原作者 :
*完成日期:
*************************************************************/
/************************文件预处理***************************/
#include <math.h>
#include "exp3_2407.h"
#define pi 3.1415927
#define Length 256
/*************************************************************/
/********************全局变量定义与初始化*********************/
int px[256];
int py[256];
int Input[Length],Output[Length];
int Package[Length];
int in, pack, out;
int i = 0;
int j = 0;
int k = 0;
/*************************************************************/
/*******************函数、子程序声明与定义********************/
void sys_ini() //系统初始化子程序
{
/*关总中断*/
asm(" setc INTM");
/*抑制符号位扩展*/
asm(" clrc SXM");
/*累加器中结果正常溢出*/
asm(" clrc OVM");
/*禁止看门狗*/
* WDCR=0x00E8;
/*配置时钟锁相为4倍频CLKOUT=4*10M=40M,使能AD模块*/
* SCSR1=0x0081;
/*io、ram、program都设为0等待读写*/
WSGR=0x0600;
/*清除所有中断标志,"写1清0"*/
* IFR=0xFFFF;
}
void adc_ini() //ADC初始化子程序
{
/*仿真器挂起时,完成最后一次ad,
高中断优先级,双排序模式,禁用其他模式*/
* ADCTRL1=0x25C0;
/*禁用中断模式,清中断标志*/
* ADCTRL2=0x0202;
/*启用排序器1,最大转换数为1*/
* MAXCONV=0x0000;
/*选择模拟输入通道为4通道*/
* CHSELSEQ1=0x0004;
}
void read_ad() //读AD结果子程序
{
int a;
/*软件启动eoc1--ad转换器*/
* ADCTRL2|=0x2000;
for(a=0;a<256;a++)
{
/*读出ad结果*/
px[a]=(* RESULT0>>6);
}
return;
}
int mu_law_compress ( int in)
{
int vin0,vin1,vin2,vpack,n,m;
vin0 = in;
vin1 = vin0/4;
vin2 = abs(vin1);
m = 0x20;
vpack = 0;
for ( n=1; n<=8; n++)
{
if ((vin2 >= m) && (vin2 < 2*m))
{
vpack = ((vin2>>n) & (0x0f)) + (0x10*(n-1));
n=9;
}
else m = m*2;
}
if (vin0 < 0) vpack = vpack + 0x80;
else vpack = vpack;
return(vpack);
}
int mu_law_expand( int pack )
{
int vpack0,vpack1,vpack2,com1,com2,vout,n,m;
vpack0 = pack;
vpack1 = (abs(vpack0)) & 0x0f;
vpack2 = (abs(vpack0) & 0x70)>>4;
com1 = 0x3f;
com2 = 0x21;
m=1;
for ( n=1; n<=8; n++)
{
if (vpack2 == (0x00+(n-1)))
{
vout = ((vpack1<<n) & (com1*m)) + (com2*m);
n=9;
}
else m = m*2;
}
if (vpack0 <128) vout = vout;
else vout = -vout;
vout = vout*4;
return(vout);
}
/*************************************************************/
/*****************中断服务子程序声明与定义********************/
interrupt void nothing() //哑中断子程序
{
return;
}
/*************************************************************/
/**************************主程序*****************************/
void main(void)
{
int m=0;
sys_ini();
adc_ini();
for(m=0; m<256;m++)
{
px[m]=(int)(32767*sin(2*pi*m/255));
}
for(j=0;j<256;j++)
{
in = px[j];
pack = mu_law_compress(in) ;
out = mu_law_expand(pack) ;
py[j] = out;
if (i<=Length-1)
{
Input[i] = in;
Package[i] = pack;
Output[i] = out;
}
i++;
i = i%Length;
}
for (;;)
{
read_ad(); /* read A/D */
for(j=0;j<256;j++)
{
in = px[j];
pack = mu_law_compress(in) ;
out = mu_law_expand(pack) ;
py[j] = out;
if (i<=Length-1)
{
Input[i] = in;
Package[i] = pack;
Output[i] = out;
}
i++;
i = i%Length;
}
k=k;
}
}
/***************************结束******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -