📄 smad.cpp
字号:
#include <dos.h>
#include <bios.h>
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#define SIZE 2
#define SIZE1 4
#define N 4500
#define KG 2.184
unsigned int offset1,seg1;
void far s1aq10();//远程调用函数(采集声音数据汇编程序)
unsigned int far *buf=(unsigned int *)0x40000000;//分配一个缓冲区,地址固定
//unsigned int *buf=NULL,*buff;
unsigned int *buff;
int mem;
void sample()//声音信号采样函数
{
int f1,sa,wc;
int b,b1,b2;
f1=0x3f;
sa=4;//采样频率为4K
wc=0x10;
// 8254-2 INITIALIZATION
//对采集板进行初始化
b=(5000/sa);
b2=b/256;
b1=b-b2*256;
outp(0x34c,f1);
outp(0x34d,0x0); // SAMPLING CLOCK INITIALIZATION 先让采样停止
outp(0x34b,0x34); // COUNTER 0 MODE 2 * WRITE CONTROL WORD
//计数器0为模式2,0x34b为8254控制口,0x34为控制字
outp(0x348,b1); //写计数器0,低字节
outp(0x348,b2); //写计数器0,高字节
outp(0x34b,0x74); // COUNTER 1 MODE 2 * WRITE CONTROL WORD,计数器1模式2,0x74为控制字
outp(0x349,b1); //计数器1,低字节
outp(0x349,b2); //计数器1,高字节
outp(0x34b,0xb0); // COUNTER 2 MODE 0 * WRITE CONTROL WORD
outp(0x34a,b1); //计数器2,低字节
outp(0x34a,b2); //计数器2,高字节
outp(0x34f,0x1); // FROM 1 WAY BEGIN ( COUNTER Clear 0 )
// SECOND INITIALIZATION WAY COUNTROL
outp(0x34d,wc); // SAMPLING CLOCK START
// printf("\n s1ad1 CALL s1aq10\n ");
// printf(" run interrupt routine s1aq10\n\n");
s1aq10();//调用汇编采集声音数据程序
}
//////////////////////////////////////////////
//// 显示一个平均值,仅供参考 //////
////////////////////////////////////////////
float countG(int gg[])
{ FILE *fp;
float G;
int i,j;//,gg[N],ss[N];
G=0.0;
for(i=0;i<500;i++){
G=G+(float)(gg[i])/500.0;
}
G=G/KG;
// printf("G=%f,gg[]=%d\n",G,gg[2]);
return G;
}
//////////////////////////////////////////////
void main()
{ float GG;
FILE *fp;
FILE *fp_TrueData;
int count=20480,i,m,bb[5001];
/*
buf=(unsigned int *)malloc(45*1024);
if(buf==NULL)
{
printf("not enough memory to allocate buf\n");
return ;
}
*/
mem=biosmemory(); //use Bios interrupt OX12 to return the size of RAM
printf("ram=%d",mem);
//---------------------把缓冲区与数据段联系起来
seg1=FP_SEG(buf); //get buf's segment to segment
offset1=FP_OFF(buf); //get buf's offset to offset
//-------------------------------------------------------
if((fp=fopen("smad.bin","wb"))==NULL)//两路采集的声音数据文件名及其路径
{
printf("Cannot open file smad.bin in main()\n");
free(buf);
return;
}
sample();//调用采样函数
buff=buf+600;//缓冲区前面的数据不稳定,空出600个点的位置(600为个人设定,可修改)
fwrite(buf,sizeof(int),count,fp);//写入两路采集的声音数据
for(m=0;m<5000;m++)//把缓冲区的数据(两路)中抽取第二路采集的数据,并把其放在整形数组bb[m]中
{
buff++; // modefied(修改)
bb[m]=(int)(*buff);
buff++;
//buff++; // added later
}
//GG=countG(bb);
if((fp_TrueData = fopen("data.bin","wb")) == NULL)//采集数据的文件名及其路径(存储在执行采集程序所在的文件夹中)
{
printf("cant create output data file!\n");
return;
}
int *buf_bb;//定义一个整形指针,指向分配的缓冲区
buf_bb = (int *)malloc(5000*sizeof(int));//为缓冲区分配内存,大小为:点数*每个点占的字节数
if(buf_bb == NULL)
{
printf("can not malloc memory!\n");
return;
}
for(m=0;m<5000;m++)//把整形数组中的第二路数据放入buf_bb中
{
*(buf_bb+m) = bb[m];
printf("buf_bb[%d] = %d\n",m,*(buf_bb+m));//显示最终存储的数据以查看(如不需要显示可以不用)
/* 显示格式:每20行显示一次,
if((m>0) && (m % 20) == 0)
{
printf("\n");
getch();//敲任何键显示下一页
}
*/
}
fwrite(buf_bb,sizeof(int),5000,fp_TrueData);//向buf_bb中写入采集的声音数据(5000点)
fclose(fp_TrueData);//关闭文件句柄
free(buf_bb);//释放内存
fclose(fp);//关闭文件句柄
//free(buf);
//printf("G=%f\n",GG);
printf("\nEND.");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -