论文部分内容阅读
摘 要:介绍了使用QT对WAV音频进行变调处理的相关概念和方法。根据WAV格式音频的格式类型和存储原理,介绍对WAV格式音频进行读取和写入方法,并在此基础上介绍了对WAV音频进行变调处理的处理的方法和C++代码。
关键词:数字图像;边缘检测;QT;C++
数字音频的变调处理是通过修改音频信号的频率来实现的,是其他语音处理如语音合成的重要准备工作。声音由物体的震动产生,音调取决于发生物体的振动频率,根据这个频率的不同,有不同的方法对乐音进行分级,世界上一般采用12平均律將纯八度均分12等分。用QT进行数字音频的变调处理程序设计可以测试各种变调算法的速率和变调效果。
1 数字音频的变调原理
对数字音频进行变调处理的基本原理是进行增减采样,升调进行减采样,降调进行增采样,同时在此基础上用帧间重叠原理可以保持相位连续性。但我们一般采用SOLA-FS的变调方法,也即在进行变采样率变调之后进行时常规整,因为一般单纯的变调结果会导致音频时长的改变。其中SOLA-FS的方法示意图如图1
整个时长规整部分是分段进行的,每个检测窗口中待检测的一段通过计算窗口中与该段后面所有段中相似度最高的一段,进行匹配,从而达到规整时长的目的。
2 程序设计步骤
程序是基于QT设计的,使用C++编程语言,所以设计过程包括界面设计和程序设计思路。
2.1 程序界面设计
程序需要用户输入数据,故设计用户数据接口即可。程序界面如图2。
2.2 程序流程设计
程序设计的实现过程为:
(1) 读取WAV音频文件的文件头和数据。
(2) 进行变调处理。
(3) 利用SOLA-FS进行时长规整。
以上三部分的主要代码为:
int xs=ui->lineEdit->text().toInt();
double a=pow(2,(double)xs/12);
int w;
if(a>1)
w=256;
else
w=500;
int ss=2*w*(a)/(1+(a))+0.5;
int sa=2*w/(1+a)+0.5;
qDebug()< //int sa=2*512
char* ch;
QByteArray ba=wavname.toLatin1();
ch=ba.data();
//wavFile.openfile(ch);
//wavHeader=&wavFile.pWav;
FILE* src;
src=fopen(wavname.toStdString().c_str(),"rb");
fread(&stru,44,1,src);//读文件头
short int intdata[stru.datasize/2];//存数据的数组--16位
unsigned int intdata_8[stru.datasize];//存数据的数组--对应8
if(stru.wBitsPerSample==16)//如果是16位
{
fread(intdata,stru.datasize,1,src);//读取相应位数的数据
s.sola(intdata,stru.datasize/2,sa,ss,w,512-ss,500);
(4)将处理后的WAV文件数据写到新文件中。
这一部分的主要代码为:
wavnameafter=QFileDialog::getSaveFileName(this,tr("保存文件"),"",tr("*.wav"));
ui->textBrowser_2->setText(wavnameafter);
char* choutdir;
QByteArray bb=wavnameafter.toLatin1();
choutdir=bb.data();
FILE* fp;
fp=fopen(wavnameafter.toStdString().c_str(),"wb");
fwrite(&stru,44,1,fp);
fwrite(s.yout,stru.datasize,1,fp);
fclose(fp);
3 程序测试实验
本程序经过8比特和16比特的单声道WAV音频测试,能够实现12级变调且均能输出变调后的音频文件。
4 其他注意问题
为了设计程序的人性化,我们必须设置简单的程序外部接口,给用户提供简单明了的变调调节方法。为此需要在程序内部根据外部程序借口输入的数据进行计算。实现代码为:
nt xs=ui->lineEdit->text().toInt();
double a=pow(2,(double)xs/12);
if(a>0);
int w=256;
else
w=512;
int ss=2*w*(a)/(1+(a))+0.5;
int sa=2*w/(1+a)+0.5;
//int sa=2*512
char* ch;
QByteArray ba=wavname.toLatin1();
ch=ba.data();
wavFile.openfile(ch);
wavHeader=&wavFile.pWav;
s.sola(wavFile.databuf2,wavFile.pWav.datasize/2,sa,ss,512,512-438,500);
关键词:数字图像;边缘检测;QT;C++
数字音频的变调处理是通过修改音频信号的频率来实现的,是其他语音处理如语音合成的重要准备工作。声音由物体的震动产生,音调取决于发生物体的振动频率,根据这个频率的不同,有不同的方法对乐音进行分级,世界上一般采用12平均律將纯八度均分12等分。用QT进行数字音频的变调处理程序设计可以测试各种变调算法的速率和变调效果。
1 数字音频的变调原理
对数字音频进行变调处理的基本原理是进行增减采样,升调进行减采样,降调进行增采样,同时在此基础上用帧间重叠原理可以保持相位连续性。但我们一般采用SOLA-FS的变调方法,也即在进行变采样率变调之后进行时常规整,因为一般单纯的变调结果会导致音频时长的改变。其中SOLA-FS的方法示意图如图1
整个时长规整部分是分段进行的,每个检测窗口中待检测的一段通过计算窗口中与该段后面所有段中相似度最高的一段,进行匹配,从而达到规整时长的目的。
2 程序设计步骤
程序是基于QT设计的,使用C++编程语言,所以设计过程包括界面设计和程序设计思路。
2.1 程序界面设计
程序需要用户输入数据,故设计用户数据接口即可。程序界面如图2。
2.2 程序流程设计
程序设计的实现过程为:
(1) 读取WAV音频文件的文件头和数据。
(2) 进行变调处理。
(3) 利用SOLA-FS进行时长规整。
以上三部分的主要代码为:
int xs=ui->lineEdit->text().toInt();
double a=pow(2,(double)xs/12);
int w;
if(a>1)
w=256;
else
w=500;
int ss=2*w*(a)/(1+(a))+0.5;
int sa=2*w/(1+a)+0.5;
qDebug()<
char* ch;
QByteArray ba=wavname.toLatin1();
ch=ba.data();
//wavFile.openfile(ch);
//wavHeader=&wavFile.pWav;
FILE* src;
src=fopen(wavname.toStdString().c_str(),"rb");
fread(&stru,44,1,src);//读文件头
short int intdata[stru.datasize/2];//存数据的数组--16位
unsigned int intdata_8[stru.datasize];//存数据的数组--对应8
if(stru.wBitsPerSample==16)//如果是16位
{
fread(intdata,stru.datasize,1,src);//读取相应位数的数据
s.sola(intdata,stru.datasize/2,sa,ss,w,512-ss,500);
(4)将处理后的WAV文件数据写到新文件中。
这一部分的主要代码为:
wavnameafter=QFileDialog::getSaveFileName(this,tr("保存文件"),"",tr("*.wav"));
ui->textBrowser_2->setText(wavnameafter);
char* choutdir;
QByteArray bb=wavnameafter.toLatin1();
choutdir=bb.data();
FILE* fp;
fp=fopen(wavnameafter.toStdString().c_str(),"wb");
fwrite(&stru,44,1,fp);
fwrite(s.yout,stru.datasize,1,fp);
fclose(fp);
3 程序测试实验
本程序经过8比特和16比特的单声道WAV音频测试,能够实现12级变调且均能输出变调后的音频文件。
4 其他注意问题
为了设计程序的人性化,我们必须设置简单的程序外部接口,给用户提供简单明了的变调调节方法。为此需要在程序内部根据外部程序借口输入的数据进行计算。实现代码为:
nt xs=ui->lineEdit->text().toInt();
double a=pow(2,(double)xs/12);
if(a>0);
int w=256;
else
w=512;
int ss=2*w*(a)/(1+(a))+0.5;
int sa=2*w/(1+a)+0.5;
//int sa=2*512
char* ch;
QByteArray ba=wavname.toLatin1();
ch=ba.data();
wavFile.openfile(ch);
wavHeader=&wavFile.pWav;
s.sola(wavFile.databuf2,wavFile.pWav.datasize/2,sa,ss,512,512-438,500);