?? 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 + -