#include "waveview.h"
#include "QPoint"
#include "QMessageBox"
WaveView::WaveView(QWidget *parent) :
QWidget(parent)
{
wfh=0;
data=0;
offset=0;
}
void WaveView::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.fillRect(this->rect(),Qt::black);
if(wfh&&data)
if(wfh->Channel==2)//双声道
{
if(wfh->PCMBitSize==16)//数据用16位表示
{
short tempL;
short tempR;
int i=0,l=0,r=0;
QPoint pl1,pl2;
QPoint pr1,pr2;
i=offset;
p.setPen(QColor::fromRgb(0,255,255));
p.drawLine(l,this->height()/4,wfh->Datasize/4,this->height()/4);
p.setPen(QColor::fromRgb(255,255,0));
p.drawLine(r,this->height()/4*3,wfh->Datasize/4,this->height()/4*3);
do
{
if(i%4==0)//左声道低字节
{
tempL=*(data+i)&0x00ff;
}
else if(i%4==1)//左声道高字节
{
tempL=(*(data+i)<<8)&0xff00;
l++;
pl2=QPoint(l,tempL);
p.setPen(Qt::red);
p.drawLine(pl1.x(),pl1.y()/this->height()/2+this->height()/4,pl2.x(),pl2.y()/this->height()/2+this->height()/4);
pl1=pl2;
}
else if(i%4==2)//右声道低字节
{
tempR=*(data+i)&0x00ff;}
else if(i%4==3)//右声道高字节
{
tempR=(*(data+i)<<8)&0xff00;
r++;
pr2=QPoint(r,tempR);
p.setPen(Qt::blue);
p.drawLine(pr1.x(),pr1.y()/this->height()/2+this->height()/4*3,pr2.x(),pr2.y()/this->height()/2+this->height()/4*3);
pr1=pr2;
}
i++;
}
while(i<wfh->Datasize);
}
}
else if(wfh->Channel==1)
{
if(wfh->PCMBitSize==16)//数据用16位表示
{
short temp;
int i=0,n=0;
QPoint p1,p2;
i=offset;
p.setPen(QColor::fromRgb(255,0,255));
p.drawLine(n,this->height()/2,wfh->Datasize/2,this->height()/2);
do
{
if(i%2==0)//低字节
{
temp=*(data+i)&0x00ff;
}
else if(i%2==1)//高字节
{
temp=(*(data+i)<<8)&0xff00;
n++;
p2.setX(n);
p2.setY(temp);
p.setPen(Qt::green);
p.drawLine(p1.x(),p1.y()/this->height()+this->height()/2,p2.x(),p2.y()/this->height()+this->height()/2);
//QMessageBox::information(this,"",QString::number(p2.x())+QString::number(p2.y()));
p1.setX(p2.x());
p1.setY(p2.y());
}
i++;
}
while(i<wfh->Datasize);
}
}
}
int WaveView::GetMaxVolume()
{
int max=0;
if(wfh&&data)
if(wfh->Channel==2)//双声道
{
if(wfh->PCMBitSize==16)//数据用16位表示
{
//QMessageBox::information(this,"datasize",QString::number(wfh->Datasize));
short tempL;
short tempR;
int i=0,l=0,r=0;
i=offset;
do
{
if(i%4==0)//左声道低字节
{
tempL=*(data+i)&0x00ff;
}
else if(i%4==1)//左声道高字节
{
tempL=(*(data+i)<<8)&0xff00;
l++;
if(tempL>0&&tempL>max)
{
max=tempL;
}
else if(tempL<0&&(-tempL)>max)
{
max=tempL;
}
}
else if(i%4==2)//右声道低字节
{
tempR=*(data+i)&0x00ff;}
else//右声道高字节
{
tempR=(*(data+i)<<8)&0xff00;
r++;
}
i++;
}
while(i<wfh->Datasize);
//返回最大响度
return max;
}
}
else if(wfh->Channel==1)//单声道
{
if(wfh->PCMBitSize==16)//数据用16位表示
{
short temp;
int i=0,n=0;
i=offset;
do
{
if(i%2==0)//低字节
{
temp=*(data+i)&0x00ff;
}
else if(i%2==1)//高字节
{
temp=(*(data+i)<<8)&0xff00;
n++;
if(temp>0&&temp>max)
{
max=temp;
}
else if(temp<0&&(-temp)>max)
{
max=temp;
}
}
i++;
}
while(i<wfh->Datasize);
//返回最大响度
return max;
}
}
return 0;
}
int WaveView::GetFrequency(short amplitude)
{
//段的开始和结束
int begin,end;
//高度
short past=0;
bool IsRecord=false;
//波的状态
wavestate ws;
//有效的波峰或者波谷
pole pl;
//符合响度的段的长度
QList<Sec> *Sections=new QList<Sec>();
//波峰
QList<QPoint> *crest=new QList<QPoint>();
//波谷
QList<QPoint> *trough=new QList<QPoint>();
//中点
QList<QPoint> *cross=new QList<QPoint>();
;
if(wfh&&data)
if(wfh->Channel==2)//双声道
{
;
}
else if(wfh->Channel==1)//单声道
{
if(wfh->PCMBitSize==16)//数据用16位表示
{
short temp;
int i=0,n=0;
i=offset;
do
{
if(i%2==0)//低字节
{
temp=*(data+i)&0x00ff;
}
else if(i%2==1)//高字节
{
temp=(*(data+i)<<8)&0xff00;
n++;
//n是当前位置,temp为振幅
//高于响度,在水平线上方的点
if(temp>0&&temp>=amplitude)
{
begin=cross->last().x();
IsRecord=true;
}
//高于响度,在水平线下方的点
else if(temp<0&&(-temp)>=amplitude)
{
begin=cross->last().x();
IsRecord=true;
}
//低于响度,在水平线上方的点
else if(temp>0&&temp<amplitude)
{
//不处理
}
//低于响度,在水平线下方的点
else if((-temp)>0&&(-temp)<amplitude)
{
//不处理
}
//中点
else
{
cross->append(QPoint(n,temp));
}
//曲线状态
//当前点在之前点的上方,曲线呈向上状态
if(past<temp)
{
//上一个状态是向下的,之前的点是波谷
if(ws==DOWN)
{
//判断波峰的位置
//有效波谷
if(past<0&&(-past)>=amplitude)
{
//之前不是有效波谷
Qt5 Wav波形文件录音及分析
4星 · 超过85%的资源 需积分: 49 6 浏览量
2014-07-31
16:57:55
上传
评论 8
收藏 13KB ZIP 举报
SlimTracy
- 粉丝: 26
- 资源: 67
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页