为什么象这样一移 ar>>id; 就可读取文件标识符串。
但不明白 为什么象这样一移 ar>>id; 就可读取文件标识符串。
typedef DWORD FOURCC; /* a four character code */
void CWaveDiagramDoc::OnOpenwav()
{
// TODO: 在此添加命令处理程序代码
//使用宏进行ASCII到宽字符的转换
USES_CONVERSION;
//创建文件选择对话框
CFileDialog dlg(TRUE,A2CW("wav"),A2CW("*.wav"),OFN_HIDEREADONLY,A2CW("WaveFiles(*.wav)|*.wav||"));
if (dlg.DoModal()==IDOK)
{
//打开文件
CFile file;
CString path=dlg.GetPathName();
file.Open(path,CFile::modeRead );
//创建CArchive对象
CArchive ar(&file,CArchive::load);
FOURCC id,chkLen,dw; //无符号双字节类型
BYTE b; //无符号字节
WORD w; //unsigned short 无符号单字长
WORD fmtTag; //格式标记
WORD wBitsPerSample; //样本位数
FOURCC dwAvgBytesRate; //平均字节率
FOURCC Len; //数据块的字节长度
ar>>id; //读取文件标识符串
if (id!=ID_RIFF) { return; }
ar>>dw>>id; //读取头后文件长度和波形文件标识符
if (id!=ID_WAVE) { return; }
ar>>id; //读取格式块标识符串
if (id!=ID_fmt) { return; }
ar>>chkLen; //读取头后块长度
ar>>fmtTag; //读取格式标记
if (fmtTag!=1) //只处理PCM(Pulse Code Modulation, 脉冲编码调制)情况
{
return;
}
ar>>wChannel; //声道数
ar>>dw; //采样率
ar>>dwAvgBytesRate; //平均字节率
ar>>w; //数据块对齐
ar>>wBitsPerSample; //样本位数
if (chkLen==18)
{
ar>>w; //扩展域大小
for (int i=0;i<w;i++) //读走扩展域的内容
{
ar>>b;
}
}
ar>>id; //读取数据块标识符
if (id==ID_fact) { ar>>dw>>dw; ar>>id; }//如果有fact块,就读取fact块的内容
if (id!=ID_data) { return; }
ar>>Len; //文件长度
BytesPerSample=wBitsPerSample/8; //一个样本的字节数
num=Len/BytesPerSample; //样本数
if (wChannel==1) //单声道
{
data=new LONG[num];
//单字节样本值v为无符号整数(0~255),实际样本值应为v-128;多字节样本值本身就是有符号的,可直接使用
if (BytesPerSample==1)
{
for (int i=0;i<num;i++)
{
ar>>b;
data[i]=b-128;
}
}
else if (BytesPerSample==2)
{
for (int i=0;i<num;i++)
{
ar>>w;
data[i]=(SHORT)w; //无符号转换成有符号数
}
}
else if (BytesPerSample==4)
{
for (int i=0;i<num;i++)
{
ar>>dw;
data[i]=(LONG)dw; //无符号转换成有符号数
}
}
else if (BytesPerSample==3)
{
for (int i=0;i<num;i++)
{
ar>>b>>w;
data[i]=w+b;
}
}
}
else if (wChannel==2) //双声道
{
LData=new LONG[num/2];
RData=new LONG[num/2];
//一个声道的样本数为num/2,左右声道交替采集
if (BytesPerSample==1)
{
for (int i=0;i<num/2;i++)
{
ar>>b;
LData[i]=b-128;
ar>>b;
RData[i]=b-128;
}
}
else if (BytesPerSample==2)
{
for (int i=0;i<num/2;i++)
{
ar>>w;
LData[i]=(SHORT)w;
ar>>w;
RData[i]=(SHORT)w;
}
}
else if (BytesPerSample==4)
{
for (int i=0;i<num/2;i++)
{
ar>>dw;
LData[i]=(LONG)dw;
ar>>dw;
RData[i]=(LONG)dw;
}
}
else if (BytesPerSample==3)
{
for (int i=0;i<num/2;i++)
{
ar>>b>>w;
LData[i]=w+b;
ar>>b>>w;
RData[i]=w+b;
}
}
}
ar.Flush(); //清除缓冲区
file.Close(); //关于文件句柄
//获取当前活动视图,强制重绘,调用OnDraw函数
CMainFrame *Mainfrm=(CMainFrame*)AfxGetMainWnd();
Mainfrm->GetActiveView()->Invalidate();
//播放声音
//PlaySound(path,NULL,SND_ASYNC);
}
}
相关推荐
完全复现虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比(Simulink仿真、Matlab代码实现)
内容概要:本文详细介绍了名为《【完全复现】虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比(Simulink仿真、Matlab代码实现)》的技术资源,重点围绕虚拟同步发电机(VSG)的自适应惯量与阻尼控制展开,涵盖系统建模、控制策略设计、根轨迹分析及调节系数对比等内容,通过Simulink仿真与Matlab代码实现,帮助读者深入理解VSG在电力系统中的动态响应特性与控制优化方法;文档还列举了大量相关科研资源,涉及电力系统、智能优化、信号处理、路径规划等多个领域,展示了丰富的仿真案例与算法应用。; 适合人群:具备电力系统、自动控制或相关专业背景,熟悉Matlab/Simulink仿真环境,有一定科研基础的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于学习和复现虚拟同步发电机的自适应控制策略,掌握其在微电网和新能源并网中的应用;②通过根轨迹与参数调节分析,优化控制系统动态性能;③结合提供的代码与模型,开展电力系统稳定性研究、课程设计或科研项目开发。; 阅读建议:建议读者结合文中提到的完整资源目录和网盘资料,下载配套的Matlab代码与Simulink模型进行实践操作,边仿真边理解理论原理,重点关注控制参数对系统稳定性的影响,并可拓展应用于其他电力电子变流器或构网型控制研究。
政府如何精准评估园区创新能力并制定有效产业政策?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
央企如何借助数据分析提升创新管理体系效能?.docx
央企如何借助数据分析提升创新管理体系效能?
政府园区如何通过数据分析提升区域科技决策效率?.docx
政府园区如何通过数据分析提升区域科技决策效率?
园区如何通过数据分析提升企业创新能力评估的精准度?.docx
园区如何通过数据分析提升企业创新能力评估的精准度?


