㈠ 单片机程序WAVE6000编译的一段c语言程序,一直提示重复定义,要怎么解决。
双击错误提示行,就会跳到程序的错误处,你这没有把程序贴上来,不好说是什么问题,程序中有关CY的用法上有错误。
㈡ c语言fir陷波器算法
#include<math.h>
#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF 10000
#define PI 3.1415926
float InputWave();
float FIR();
float fHn[FIRNUMBER]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,
-0.018,0.049,-0.02,0.11,0.28,0.64,0.28,
-0.11,-0.02,0.049,-0.018,-0.009,0.01,
-0.002,-0.002,0.001,0.0,0.0
};
float fXn[FIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[256],fOut[256];
int nIn,nOut;
main()
{
nIn=0; nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*1.4;
while ( 1 )
{
fInput=InputWave();
fIn[nIn]=fInput;
nIn++; nIn%=256;
fOutput=FIR();
fOut[nOut]=fOutput;
nOut++;
if ( nOut>=256 )
{
nOut=0; /* 请在此句上设置软件断点 */
}
}
}
float InputWave()
{
for ( i=FIRNUMBER-1;i>0;i-- )
fXn[i]=fXn[i-1];
fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;
fSignal1+=fStepSignal1;
if ( fSignal1>=f2PI ) fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if ( fSignal2>=f2PI ) fSignal2-=f2PI;
return(fXn[0]);
}
float FIR()
{
float fSum;
fSum=0;
for ( i=0;i<FIRNUMBER;i++ )
{
fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}
㈢ C语言编写程序将多个wav文件拼接成一个音频wav文件并播放
#include<stdio.h>
#include<string.h>
#defineRIFF_SIGN_ID0x46464952ul
#defineWAVE_SIGN_ID0x45564157ul
#defineFMT__SIGN_ID0x20746D66ul
#defineFACT_SIGN_ID0x74636166ul
#defineDATA_SIGN_ID0x61746164ul
#ifndefDWORD
typedefunsignedlongDWORD;
#endif
#ifndefWORD
typedefunsignedshortWORD;
#endif
#ifndefBYTE
typedefunsignedcharBYTE;
#endif
structRIFF_HEADER
{
DWORDRiffID;//资源交换文件标志0x46464952'R','I','F','F'
DWORDRiffSize;//从下个地址开始到文件尾的总字节数
DWORDRiffFormat;//WAV文件标志0x45564157'W','A','V','E'
};
structWAVE_FORMAT
{
WORDFormatTag;//格式种类(值为1时,表示数据为线性PCM编码)
WORDChannels;//通道数,单声道为1,双声道为2
DWORDSamplesPerSec;//采样频率
DWORDAvgBytesPerSec;//每秒所需字节数
WORDBlockAlign;//数据块对齐单位(每个采样需要的字节数)
WORDBitsPerSample;//每个采样需要的bit数
WORDotherInfo;//附加信息(可选,通过Size来判断有无)
};
structFMT_BLOCK
{
DWORDFmtID;//波形格式标志0x20746D66'f','m','t',''
DWORDFmtSize;//波形格式部分长度(一般为00000010H)
WAVE_FORMATwavFormat;//波形数据格式
};
structUNKNOW_BLOCK
{
DWORDID;//未知块
DWORDSize;//未知块长度
};
structFACT_BLOCK
{
DWORDFactID;//可选部分标识0x74636166'f','a','c','t'
DWORDFactSize;//可选部分长度
BYTEData[1];//可选部分数据
};
structDATA_BLOCK
{
DWORDDataID;//数据标志符0x61746164,'d','a','t','a'
DWORDDataSize;//DATA总数据长度字节
BYTEData[1];//数据
};
BYTE*openWaveFile(constchar*name);
BYTE*getWaveData(BYTE*wav,int*dLen);
voidprintWaveFormat(BYTE*wav);
intsaveWaveFile(constchar*name,BYTE*wav);
BYTE*catWave(BYTE*&wav1,BYTE*&wav2);
size_tgetTotalLen(BYTE*wav);
intmain(intargc,char*argv[])
{
intdLen;
BYTE*data1=openWaveFile("1.wav");
printWaveFormat(data1);
BYTE*data2=openWaveFile("2.wav");
printWaveFormat(data2);
data1=catWave(data1,data2);
printWaveFormat(data1);
saveWaveFile("3.wav",data1);
return0;
}
BYTE*openWaveFile(constchar*name)
{
size_treadByte;
FILE*fp=fopen(name,"rb");
if(fp==NULL)returnNULL;
RIFF_HEADERfh;
if(fread(&fh,sizeof(fh),1,fp)!=1)
{
fclose(fp);
printf("RiffHeader文件长度错误 ");
returnNULL;
}
if(fh.RiffFormat!=WAVE_SIGN_ID||fh.RiffID!=RIFF_SIGN_ID)
{
fclose(fp);
printf("文件标识符错误ID:%08XFormat:%08X ",fh.RiffID,fh.RiffFormat);
returnNULL;
}
BYTE*r=newBYTE[fh.RiffSize+10],*pr;
if(r==NULL)
{
fclose(fp);
printf("内存申请错误 ");
returnNULL;
}
readByte=fread(r,1,fh.RiffSize-4,fp);
if(readByte!=fh.RiffSize-4)
{
delete[]r;
printf("wave文件长度错误%d%d ",readByte,fh.RiffSize);
returnNULL;
}
fclose(fp);
FMT_BLOCK*fb=(FMT_BLOCK*)r;
if(fb->FmtID!=FMT__SIGN_ID)
{
printf("格式标识符错误或格式大小错误ID:%08X ",fb->FmtID);
delete[]r;
returnNULL;
}
if(fb->wavFormat.FormatTag!=1)
{
delete[]r;
printf("不支持的格式Format:%d ",fb->wavFormat.FormatTag);
returnNULL;
}
pr=r+8+fb->FmtSize;
while(1)
{
UNKNOW_BLOCK*ub=(UNKNOW_BLOCK*)pr;
if(ub->ID==FACT_SIGN_ID)
{
printf("Fact标签length:%d ",ub->Size);
pr+=8+ub->Size;
}
elsebreak;
}
DATA_BLOCK*db=(DATA_BLOCK*)pr;
if(db->DataID!=DATA_SIGN_ID)
{
delete[]r;
printf("数据错误 ");
returnNULL;
}
returnr;
}
BYTE*getWaveData(BYTE*wav,int*dLen)
{
UNKNOW_BLOCK*ub=(UNKNOW_BLOCK*)wav;
while(ub->ID!=DATA_SIGN_ID)
{
switch(ub->ID)
{
caseDATA_SIGN_ID:
break;
caseFMT__SIGN_ID:
caseFACT_SIGN_ID:
ub=(UNKNOW_BLOCK*)(((BYTE*)ub)+ub->Size+8);
break;
default:
printf("错误标签%08X ",ub->ID);
returnNULL;
}
}
DATA_BLOCK*db=(DATA_BLOCK*)ub;
*dLen=db->DataSize;
returndb->Data;
}
size_tgetTotalLen(BYTE*wav)
{
size_tr=0;
UNKNOW_BLOCK*ub=(UNKNOW_BLOCK*)wav;
while(1)
{
switch(ub->ID)
{
caseDATA_SIGN_ID:
r+=ub->Size+8;
returnr;
caseFMT__SIGN_ID:
caseFACT_SIGN_ID:
r+=ub->Size+8;
ub=(UNKNOW_BLOCK*)(((BYTE*)ub)+ub->Size+8);
break;
default:
printf("错误标签%08X ",ub->ID);
returnNULL;
}
}
return-1;
}
voidprintWaveFormat(BYTE*wav)
{
intlen;
getWaveData(wav,&len);
FMT_BLOCK*fb=(FMT_BLOCK*)wav;
printf("Wave格式:PCM ");
printf("通道数量:%d ",fb->wavFormat.Channels);
printf("采样频率:%dHz ",fb->wavFormat.SamplesPerSec);
printf("每秒所需字节数:%d字节 ",fb->wavFormat.AvgBytesPerSec);
printf("数据块对齐单位:%d字节 ",fb->wavFormat.BlockAlign);
printf("每个采样需要的bit数:%dbit ",fb->wavFormat.BitsPerSample);
printf("长度:%.2f秒 ",(double)len/fb->wavFormat.AvgBytesPerSec);
}
BYTE*catWave(BYTE*&wav1,BYTE*&wav2)
{
FMT_BLOCK*fb1=(FMT_BLOCK*)wav2;
constFMT_BLOCK*fb2=(constFMT_BLOCK*)wav2;
if(
fb1->wavFormat.AvgBytesPerSec==fb2->wavFormat.AvgBytesPerSec&&
fb1->wavFormat.BitsPerSample==fb2->wavFormat.BitsPerSample&&
fb1->wavFormat.BlockAlign==fb2->wavFormat.BlockAlign&&
fb1->wavFormat.Channels==fb2->wavFormat.Channels&&
fb1->wavFormat.FormatTag==fb2->wavFormat.FormatTag&&
fb1->wavFormat.SamplesPerSec==fb2->wavFormat.SamplesPerSec)
{
intlen1=getTotalLen(wav1),len2;
BYTE*Data2=getWaveData(wav2,&len2);
BYTE*nD=newBYTE[len1+len2+10];
if(nD==NULL)returnNULL;
memcpy(nD,wav1,len1);
delete[]wav1;
wav1=nD;
BYTE*Data1=getWaveData(wav1,&len1);
DATA_BLOCK*db1=(DATA_BLOCK*)(Data1-8);
db1->DataSize+=len2;
memcpy(Data1+len1,Data2,len2);
returnwav1;
}
returnNULL;
}
intsaveWaveFile(constchar*name,BYTE*wav)
{
FILE*fp=fopen(name,"wb");
if(fp==0)return0;
intlen=getTotalLen(wav);
RIFF_HEADERrh;
rh.RiffFormat=WAVE_SIGN_ID;
rh.RiffID=RIFF_SIGN_ID;
rh.RiffSize=len+4;
fwrite(&rh,sizeof(rh),1,fp);
fwrite(wav,1,len,fp);
fclose(fp);
return1;
}
㈣ 正弦波产生C语言源程序代码
以经验看来你是要做单片机方面波形输出,DAC输出,或者做模拟示波器什么的。
有两种办法:
一是查表法,优点是计算量少,占用RAM少,算法简单,缺点是占用储存内存较多,参数比较固定。
查表法的基本思路就是,通过把sin函数进行采样,得到的值记录成一个表,将表以数组的形式放在程序中,通过循环读取数组的值达到查表的目的。
二是计算值法,优缺点跟查表法恰好相反。
计算值法的基本思路是通过特定算法,将特定时间所需的特定值计算出来。
这里给你提供一个计算值法的核心代码,作为指导建议,根据实际情况修调。
doubleSinWave(doublescale,intcycle_time)
{
inta;
doublePI=3.1416;
intresolution_ratio=100;//分辨率,描述采样量,越高的分辨率计算越多
for(a=0;a<resolution_ratio;a++)
{
DAC_OUT(scale*sin(2*PI*a/resolution_ratio));
delay(cycle_time/resolution_ratio);
}
}
voiddelay(intus)
{
//......
}
voidDAC_OUT(intdata)
{
//......
}
㈤ 二阶陷波器c语言实现
下面介绍主要算法:
#include<math.h>
#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF 10000
#define PI 3.1415926
float InputWave();
float FIR();
float fHn[FIRNUMBER]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,
-0.018,0.049,-0.02,0.11,0.28,0.64,0.28,
-0.11,-0.02,0.049,-0.018,-0.009,0.01,
-0.002,-0.002,0.001,0.0,0.0
};
float fXn[FIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[256],fOut[256];
int nIn,nOut;
main()
{
nIn=0; nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*1.4;
while ( 1 )
{
fInput=InputWave();
fIn[nIn]=fInput;
nIn++; nIn%=256;
fOutput=FIR();
fOut[nOut]=fOutput;
nOut++;
if ( nOut>=256 )
{
nOut=0; /* 请在此句上设置软件断点 */
}
}
}
float InputWave()
{
for ( i=FIRNUMBER-1;i>0;i-- )
fXn[i]=fXn[i-1];
fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;
fSignal1+=fStepSignal1;
if ( fSignal1>=f2PI ) fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if ( fSignal2>=f2PI ) fSignal2-=f2PI;
return(fXn[0]);
}
float FIR()
{
float fSum;
fSum=0;
for ( i=0;i<FIRNUMBER;i++ )
{
fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}
㈥ 关于C语言语句buff[i] = ((WAVEBUFF *)&WaveBuff)[i].Ia;
你贴的代码不是很全的,我就断章取义,解释一下吧
&是取地址运算符
(WAVEBUFF *)&WaveBuff)这句话的作用就是:
取WaveBuff地址,然后(WAVEBUFF *)强制类型转换成 WAVEBUFF类型的地址。
推测1:WaveBuff这个结构体的第一项是 WAVEBUFF类型的结构体数组(并且这个结构体有la的元素)!
buff[i] = ((WAVEBUFF *)&WaveBuff)[i].Ia;
把WaveBuff 内部成员对应的 [i].la的值付给buff[i];
推测2:WaveBuff本身就WAVEBUFF类型,
buff[i] = ((WAVEBUFF *)&WaveBuff)[i].Ia;可以简化成buff[i] = WaveBuff[i].Ia;
其意义不言而名了!!
如果不是的话,可以把代码贴全,好再分析了。
㈦ dy=Dy[(i+offset)%Wavewid];在C语言中是什么意思啊
在一个预先定义好的数组里,取出一个来,赋给一个变量 dy
要取的索引位置,是通过表达式 (i+offset)%Wavewid 来决定的。
没有上下文也说不清
㈧ wave可不可以用C语言来编的
当然可以啊
㈨ 请问用C语言怎么编写程序产生一个正弦波
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#defineFQ1000
#defineAM1000
#definePI3.14
intmain()
{
FILE*stream;
inti=0,j=0;
doublevalue=0,bb=0;
shortgg[1000];
stream=fopen("sine_wave.raw","wb");
value=(2*PI/8);
for(i=0;i<1000;i++)
{
bb=AM*sin(value*i);
gg[i]=(short)bb;
//fprintf(stream,"%d/n",gg);
}
fwrite(gg,2,1000,stream);
fclose(stream);
return;
}
㈩ 【求大神指导】wav文件数据区(文件头后面的)怎么用c语言编写啊
wav文件是微软保存音频数据的文件,它的数据内容一般都是录音的数据内容,下面的wav文件介绍供参考:
首先wav文件是基于微软版本的EA-IFF方法来保存数据的,IFF是Electronic Arts公司开发的一种文件格式(EA IFF 1985),基于基本的IFF格式,wav的收保存在各种不同的“chunk”中。
在wav文件中,有三种chunk是必须的,另外的chunk都是可选的,简单的可以如图所示:
1.'RIFF','WAVE' chunk
这个chunk主要是一个标记,告诉我们这是一个wav文件。它的数据信息可以用如下:
----------------------------------
|ID | 4 Bytes | 'RIFF' |
----------------------------------
| Size | 4 Bytes| |
----------------------------------
| Type | 4 Bytes| 'WAVE'|
----------------------------------
所以wav文件的wave chunk是很简单的,共有12个字节,size表示的是整个wav文件大小除去该chunk的ID和Size的大小,也就是FileSize-8。
2."fmt" chunk
格式chunk包含个各种描述内容格式的重要参数,比如音频的采样率,比特率等。它的信息可以用如下的图来表示:
--------------------------------------------------------------------
|ID | 4Bytes | 'fmt'|
--------------------------------------------------------------------
|Size | 4Bytes | 数值为16或18,18则最后又附加信息 |
------------------------------------------------------------------------
|FormatTag | 2 Bytes | 编码方式,一般为0x0001|
--------------------------------------------------------------------|
|Channels | 2 Bytes | 声道数目,1--单声道;2--双声道 |
--------------------------------------------------------------------|
| SamplesPerSec | 4Bytes | 采样频率|
--------------------------------------------------------------------|
| AvgBytesPerSec| 4Bytes | 每秒所需字节数|
--------------------------------------------------------------------|
|BlockAlign | 2 Bytes | 数据块对齐单位(每个采样需要的字节数) |
--------------------------------------------------------------------|
| BitsPerSample | 2Bytes | 每个采样需要的bit数|
--------------------------------------------------------------------|
|| 2 Bytes | 附加信息(可选,通过Size来判断有无) |
-------------------------------------------------------------------- ----
该部分的内容以’fmt’为标记,4字节size表示的该chunk除去ID和Size的大小,如图中所示为16或18;FormatTag表示的该wav数据的编码,这里最常用的编码就是0x0001,为PCM编码,其他的编码,可以参考微软的Windows wave格式。声道数,采样率不再累赘,blockalign以8字节对齐,可以用下面的方式计算
nBlockAlign = channels * ((nBitsPerSample + 7) / 8);
nBitsPerSample表示音频数据字长,16位的bit最为常见;AvgBytesPerSe表示每秒钟的字节数。
3.'data'chunk
数据chunk则保存了真正的wav数据;它的格式如下:
|ID | 4 Bytes | 'data' |
----------------------------------
| Size | 4 Bytes| |
----------------------------------
| data|| |
----------------------------------
以'data'作为该Chunk的标示。然后是数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,每个byte中wav数据的bit位置可以分成以下几种形式(以intel的little edian为例):
a,单声道8位字长
---------------------------------------------------------------------
| 单声道 | 取样1 | 取样2 | 取样3 | 取样4 |
| |--------------------------------------------------------
| 8bit量化 | 声道0 | 声道0 | 声道0 | 声道0 |
---------------------------------------------------------------------
b, 双声道8位字长
|双声道 |取样1|取样2|
| |--------------------------------------------------------
| 8bit量化 | 声道0(左) | 声道1(右) | 声道0(左) | 声道1(右) |
---------------------------------------------------------------------
c, 单声道16位字长
||取样1|取样2|
| 单声道 |--------------------------------------------------------
| 16bit量化 | 声道0 | 声道0| 声道0 | 声道0 |
| | (低位字节) | (高位字节) | (低位字节) | (高位字节) |
---------------------------------------------------------------------
c, 双声道16位字长
||取样1|
| 双声道 |--------------------------------------------------------
| 16bit量化 | 声道0(左) | 声道0(左) | 声道1(右) | 声道1(右)|
| | (低位字节) | (高位字节) | (低位字节) | (高位字节)|
---------------------------------------------------------------------
参考:
http://www.codeguru.com/cpp/g-m/multimedia/audio/article.php/c8935/PCM-Audio-and-Wave-Files.htm#page-1
http://blog.csdn.net/bluesoal/article/details/932395