| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 684 人关注过本帖
标题:这是个wav文件波形示例,但显示总有些不正常,多了一些条码样的线条,谁能帮我 ...
只看楼主 加入收藏
ymm0792
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-12-22
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
这是个wav文件波形示例,但显示总有些不正常,多了一些条码样的线条,谁能帮我看看什么改,谢谢了
Option Explicit
Dim DAT() As Byte         '样本数据

Private Sub 绘制_Click()
On Error GoTo 100
Dim filename As String
Dim tagType As String * 4 '标记字符
Dim dataSum As Long       '样本数据个数
Dim Channels As Integer   '声道数
Dim SampleBit As Integer  '量化位数
Dim Temp1 As Long

CommonDialog1.filename = "*.wav"
CommonDialog1.DefaultExt = ".wav"
CommonDialog1.ShowOpen
filename = CommonDialog1.filename
Open filename For Binary As #1

Get #1, , tagType
If tagType <> "RIFF" Then GoTo 100 '如果不是RIFF退出
Get #1, 9, tagType
If tagType <> "WAVE" Then GoTo 100 '如果不是WAVE退出
Get #1, , tagType
If tagType <> "fmt " Then GoTo 100 '如果不是fmt 退出

Get #1, , dataSum         '格式块长度
Get #1, 23, Channels      '声道数
Get #1, 35, SampleBit     '量化位数
Get #1, 21 + dataSum, tagType
If tagType = "fact" Then  '如果是附加块
  Get #1, , Temp1         '废弃
  Get #1, , Temp1         '废弃
  Get #1, , tagType       '废弃
  Get #1, , dataSum       '数据块长度
ElseIf tagType = "data" Then
  Get #1, , dataSum       '数据块长度
Else
  GoTo 100
End If

ReDim DAT(dataSum)
Get #1, , DAT
Close #1

Select Case Channels         '绘制波形
  Case 1                     '单声道
    Select Case SampleBit
      Case 8:  DrawWaves8_1 Picture1   '如果是8位
      Case 16: DrawWaves16_1 Picture1 '如果是16位
    End Select
  Case 2                     '立体声
    Select Case SampleBit
      Case 8:  DrawWaves8_2 Picture1   '如果是8位
      Case 16: DrawWaves16_2 Picture1 '如果是16位
    End Select
End Select
Exit Sub

100
Close #1
End Sub

Private Sub DrawWaves8_1(WavBox As PictureBox)
Dim i As Long
Dim exten As Long  '波幅
Dim lastX As Long  '水平坐标
Dim curY1 As Long  '垂直坐标
Dim curY2 As Long  '垂直坐标

WavBox.WavBox.ScaleWidth = UBound(DAT) '窗体宽度=样本个数
exten = WavBox.ScaleHeight / 2  '波幅=窗体高度的二分之一
WavBox.Cls

For i = 0 To WavBox.ScaleWidth
  curY1 = (DAT(i) - 128) / 128 * exten '垂直坐标=样本数据*最大波幅
  WavBox.Line (lastX, exten + curY2)-(i, exten + curY1)
  curY2 = curY1: lastX = i
Next
End Sub

Private Sub DrawWaves8_2(WavBox As PictureBox)
Dim i As Long
Dim exten As Long    '波幅
Dim lastX As Long    '水平坐标
Dim curLY1 As Long   '左声道垂直坐标
Dim curLY2 As Long   '左声道垂直坐标
Dim curRY1 As Long   '右声道垂直坐标
Dim curRY2 As Long   '右声道垂直坐标
Dim LYOffset As Long '左声道垂直偏移量
Dim RYOffset As Long '右声道垂直偏移量

WavBox.ScaleWidth = UBound(DAT) / 2 '窗体宽度=单声道样本个数
exten = WavBox.ScaleHeight / 4      '最大波幅为窗体高度的四分之一
LYOffset = exten
RYOffset = exten * 3
WavBox.Cls

For i = 0 To WavBox.ScaleWidth
  curLY1 = (DAT(i * 2) - 128) / 128 * exten
  curRY1 = (DAT(i * 2 + 1) - 128) / 128 * exten
  WavBox.Line (lastX, LYOffset + curLY2)-(i, LYOffset + curLY1) '画左声道波形
  WavBox.Line (lastX, RYOffset + curRY2)-(i, RYOffset + curRY1) '画右声道波形
  curLY2 = curLY1: curRY2 = curRY1: lastX = i
Next
End Sub

Private Sub DrawWaves16_1(WavBox As PictureBox)
Dim i As Long, d As String
Dim exten As Long  '波幅
Dim lastX As Long  '水平坐标
Dim curY1 As Long  '垂直坐标
Dim curY2 As Long  '垂直坐标

WavBox.ScaleWidth = UBound(DAT) / 2 '窗体宽度=样本个数
exten = WavBox.ScaleHeight / 2      '波幅=窗体高度的二分之一
WavBox.Cls

For i = 0 To WavBox.ScaleWidth
  d = "&H" & Hex(DAT(i * 2 + 1)) & Hex(DAT(i * 2))
  curY1 = Val(d) / 32768 * exten
  WavBox.Line (lastX, exten + curY2)-(i, exten + curY1)
  curY2 = curY1: lastX = i
Next
End Sub

Private Sub DrawWaves16_2(WavBox As PictureBox)
Dim i As Long, j As Long, dL As String, dR As String
Dim exten As Long    '最大波幅
Dim lastX As Long    '水平坐标
Dim curLY1 As Long   '左声道垂直坐标
Dim curLY2 As Long   '左声道垂直坐标
Dim curRY1 As Long   '右声道垂直坐标
Dim curRY2 As Long   '右声道垂直坐标
Dim LYOffset As Long '左声道垂直偏移量
Dim RYOffset As Long '右声道垂直偏移量

WavBox.ScaleWidth = UBound(DAT) / 4 '窗体宽度=立体声样本个数/4
exten = WavBox.ScaleHeight / 4      '最大波幅为窗体高度的四分之一
LYOffset = exten
RYOffset = exten * 3
WavBox.Cls

For i = 0 To WavBox.ScaleWidth
  j = i * 4
  dL = "&H" & Hex(DAT(j + 1)) & Hex(DAT(j))
  dR = "&H" & Hex(DAT(j + 3)) & Hex(DAT(j + 2))
  curLY1 = Val(dL) / 32768 * exten
  curRY1 = Val(dR) / 32768 * exten
  WavBox.Line (lastX, LYOffset + curLY2)-(i, LYOffset + curLY1) '画左声道波形
  WavBox.Line (lastX, RYOffset + curRY2)-(i, RYOffset + curRY1) '画右声道波形
  curLY2 = curLY1: curRY2 = curRY1: lastX = i
Next
End Sub
搜索更多相关主题的帖子: 条码 样本 
2014-12-22 20:37
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:10 
没研究就没有发言权。很少触及这方面,不过好像wav文件第14H字节是表明它的压缩方式的,一般会用哈弗曼编码压缩,是不是你没有处理压缩造成的?
2014-12-23 19:11
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:10 
代码没有发现什么问题。感觉是图形控件宽度造成这种现象,比如windows\media目录下自带的chimes.wav文件,双声道,采样频率22k,全文件波形一共有一万四千多个点。如果图形控件宽度较小就会出现你说的条码现象,就算不画邻近点的连线,只画点,也同样,感觉附加了一个固定偏移的噪声信号。但如果把图形控制宽度加大,比如60000。波形如附图,没有了条码。我认为是不是可以使用窗口的方法,比如在一图形控件内只显示波形的某一段。
传不了附件?
另外改为For i = 0 To WavBox.ScaleWidth-1
否则越界[attach]78489[/attach]终于可以上传了.
图片附件: 游客没有浏览图片的权限,请 登录注册

纵向分辨率也是原因之一.如两个字节表示一采样点,最大值是65535,取半后32767.要在有限高度的图形控件上描述此值,分辨也相当低

[ 本帖最后由 lianyicq 于 2014-12-24 12:42 编辑 ]

大开眼界
2014-12-24 09:47
flex_liu
Rank: 1
等 级:新手上路
威 望:1
帖 子:2
专家分:0
注 册:2015-10-9
收藏
得分:0 
感觉读取的数据还是有问题,我用一个2s左右,20Hz的正弦波,读取的波形如下:
图片附件: 游客没有浏览图片的权限,请 登录注册
2015-10-09 20:51
flex_liu
Rank: 1
等 级:新手上路
威 望:1
帖 子:2
专家分:0
注 册:2015-10-9
收藏
得分:0 
数据读错了。其中类似这行:d = "&H" & Hex(DAT(i * 2 + 1)) & Hex(DAT(i * 2))中,如果地位是0x,比如05,01,06等,读出来自动缩为5,1,6了.我稍微更改了下:
  l = Hex(DAT(i * 2)):   If Len(l) = 1 Then l = "0" & l
  h = Hex(DAT(i * 2 + 1)):    If Len(h) = 1 Then h = "0" & h
  d = "&H" & h & l
这样,再次读取一个2s左右,20Hz的正弦波,读取的波形如下:
图片附件: 游客没有浏览图片的权限,请 登录注册
2015-10-09 22:04
快速回复:这是个wav文件波形示例,但显示总有些不正常,多了一些条码样的线条,谁能 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018127 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved