任务:用qt5画wav波形图
步骤:
1、新建项目 - Qt Gui 应用 - 工程名 - 基类选择QWidget(类名默认为widget) - 完成,生成widget.h, main.cpp, widget.cpp
2、接下来要添加一个自定义类,用来读入wav头文件信息,以及读入wav数据。
向项目添加新建头文件 WaveFile.h
#ifndef WAVEFILE_H
#define WAVEFILE_H
#include <string>
using namespace std;
class WaveFile
{
public:
struct wavehead
{
char sign[4]; //"RIFF"标志 4
unsigned long int flength; //文件长度 8
char wavesign[4]; //"WAVE"标志 12
char fmtsign[4]; //"fmt"标志 16
unsigned long int unused; // 过渡字节(不定)20
unsigned short formattype; //格式类别(10H为PCM形式的声音数据) 22
unsigned short channelnum; //通道数,单声道为1,双声道为2 24
unsigned long int samplerate; //采样率(每秒样本数),表示每个通道的播放速度 28
unsigned long int transferrate; //传输速率,每秒字节数
unsigned short int adjustnum; //数据调整数,一个数据单位所占的字节
unsigned short int databitnum; //每样本的数据位数,调整数*8 36
}head;
unsigned long int datalength; //采样数据总数
unsigned long int totalsample; //采样点数
unsigned long int bitpersample; //采样位数
unsigned long int datanum; //数据块大小,若采样位数为16,开辟数据总数的大小,若为8,每个short型高地位可存储两个数据,开辟1/2大小即可
short *Data; //数据块指针
WaveFile() {}
~WaveFile() {}
void WavRead(string filename)
{
FILE *fp;
if((fp=fopen(filename.c_str(),"rb"))==NULL)
{
//printf("cannot read wave file\n");
exit(0);
}
fread(&head,sizeof(head),1,fp);
char datasign[4];
fread(datasign,4,1,fp);
fread(&datalength,4,1,fp);
totalsample = datalength / head.adjustnum;
bitpersample = head.databitnum / head.channelnum;
datanum = totalsample*bitpersample/16;
Data = new short[datanum+10]; //开辟数据块,若采样位数为16,开辟数据总数的大小,若为8,每个short型高地位可存储两个数据,开辟1/2大小即可
if(bitpersample==16)
{
for(int i=0;!feof(fp) && i<datanum;i++) //读入数据
{
fread(&Data[i],2,1,fp);
if(head.channelnum==2) //若是双声道,跳过第二个声道
fseek(fp,2,SEEK_CUR);
}