ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1689|回复: 18

[求助] 用VBA绘制wav音频的波形图或频谱图

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-2-2 10:52 | 显示全部楼层 |阅读模式
本帖最后由 aman1516 于 2023-2-2 17:09 编辑

想通过解析一个WAV文件,得到如下的图片:
无标题.png
用pyhton能做到,不知可否用VBA实现,
或通过VBA调用pyhton来实现,
参考:
https://blog.csdn.net/Asa_Ho/article/details/107364446

https://blog.csdn.net/weixin_444 ... tm_relevant_index=8

https://blog.csdn.net/weixin_307 ... tm_relevant_index=9

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-2 19:18 | 显示全部楼层
貌似能这样调用执行py文件,
Sub RunPythonScript()
Dim shell As Object
Dim exePath As String, scriptPath As String
Dim waitOnReturm As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
    Set shell = VBA.CreateObject("Wscript.Shell")
    exePath = "C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\python.exe"    '如果中间有空格 " & Chr(34) & "Xxxxxx Yyy" & Chr(34) & "
    scriptPath = "D:\Downloads\main.py"
    shell.Run Chr(34) & exePath & Chr(34) & " " & Chr(34) & scriptPath & Chr(34)
End Sub
PY文件却不知怎样才能输出图形
https://blog.csdn.net/weixin_453 ... tm_relevant_index=4
熟悉Python的朋友看一看
直接VBA实现就最好了

TA的精华主题

TA的得分主题

发表于 2023-2-3 08:40 | 显示全部楼层
用柱形图,只要数据足够多,就看起来细细的,最后选择性粘贴成图片就好了吧

TA的精华主题

TA的得分主题

发表于 2023-2-3 09:08 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-3 10:27 | 显示全部楼层
ivccav 发表于 2023-2-3 09:08
只要数据够多,用图表就可以做到了:

wav文件格式解析

wav文件支持多种不同的比特率、采样率、多声道音频。
wav是一种RIFF(resource interchange file format 资源互换文件格式,以chunk为单位组织文件)格式文件。在windows上,大部分多媒体文件都是RIFF文件。
wav文件由RIFF chunk构成,fmt /data chunk是其必须的两个子chunk,除此以外还可以有fact等可选chunk,我们在做parse的时候,主要是分析fmt chunk的数据。

wav标准结构
w1.jpg
1.wav文件都是由chunk组成,chunk的格式如下:

size    内容        解释
4    bytes    ID 如“RIFF”
4    bytes    chunk size N 如标准fmt chunk为16字节
N    bytes    data chunk的内容
2.只有“fmt ”、“data”两个子chunk的wav文件格式:

size    内容        解释
4 bytes        RIFF        文件类型格式
4 bytes        filesize        其值为filesize字段后的大小,真正的文件大小为filesize + 8 bytes
4 bytes        WAVE        文件格式
4 bytes        "fmt "        chunk id,fmt即format,这个chunk保存了音频的采样率、声道数、采样位数等关键信息
4 bytes        fmt chunk size        fmt chunk的大小,一般有16/18/20/22/40字节(也有超过40字节的情况,如果不知道后面部分的含义,直接跳过即可),超过16字节部分为扩展块
2 bytes        AudioFormat        编码格式代码,其值见 《常见编码格式》 表
2 bytes        Num channels        声道数,一般有1-8
4 bytes        Sample Rate        采样率,8/11.025/12/16/22.05/24/32/44.1/48/64/88.2/96/176.4/192 kHZ
4 bytes        Byte Rate        传输速率,每秒的字节数,计算公式为:采样率*channels*采样位数/8
2 bytes        Block Align        块对齐,告知播放软件一次性需处理多少字节,公式为: 采样位数*声道数/8
2 bytes        Bits Per Sample        采样位数,一般有8/16/24/32/64,值越大,对声音的还原度越高
4 bytes        “data”        data chunk id
4 bytes        Data Size N        原始音频数据的大小
N bytes        Data        原始音频数据,也是我们最终想获得的部分,数据保存方式见 pcm存储 表
3.fmt 扩展块
fmt chunk的大小一般为16/18/20/22/40字节,当其大小大于16字节时,多出的内容都保存在扩展块中。

size          内容        解释
2bytes        cbsize        扩展块长度,为0时,fmt chunk size为18;为2时,fmt chunk size为20;为22时,fmt chunk size为40
2bytes        有效采样位数        最大值为采样字节数*8
4bytes        声道掩码    声道号与扬声器位置的映射掩码
2bytes        codec        真正的编码格式代码(相对于extension 的fmt codec为0xFFFE而言)
14bytes        unknown        还不知道其含义,在mediainfo中与2字节的codec一起组成 subformat

通过解析wave格式文件的方法,是可以提取wave文件中的数据的,只是不会,在慢慢研究中......

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-3 10:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
有个VB的例子,一般VB能实现,想来VBA也能实现吧
https://blog.csdn.net/jxlhxyp/article/details/3431032

TA的精华主题

TA的得分主题

发表于 2023-2-3 13:38 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2023-2-5 21:35 编辑
aman1516 发表于 2023-2-2 19:18
貌似能这样调用执行py文件,
Sub RunPythonScript()
Dim shell As Object

参考楼下附件更新

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-2-3 14:32 来自手机 | 显示全部楼层
chatgpt 给的代码 没测试

Sub Waveform()
    Dim WaveFile As String
    WaveFile = Application.GetOpenFilename("*.wav", , "打开音频文件")
    If WaveFile = "False" Then Exit Sub
    Dim Wave As Object
    Set Wave = CreateObject("sapi.spwave")
    Wave.Open WaveFile
    Dim WaveData As Variant
    WaveData = Wave.GetWaveData
    Dim WaveLength As Integer
    WaveLength = UBound(WaveData)
    Dim WaveData2 As Variant
    ReDim WaveData2(WaveLength)
    Dim i As Integer
    For i = 0 To WaveLength
        WaveData2(i) = WaveData(i) / CLng(32767)
    Next
    With ActiveChart
        .ChartType = xlXYScatter
        .SeriesCollection.NewSeries
        .SeriesCollection(1).Name = WaveFile
        With .SeriesCollection(1).XValues
            .Clear
            For i = 0 To WaveLength
                .Add i
            Next
        End With
        With .SeriesCollection(1).Values
            .Clear
            For i = 0 To WaveLength
                .Add WaveData2(i)
            Next
        End With
        .SeriesCollection(1).MarkerStyle = xlMarkerStyleNone
        .SeriesCollection(1).Border.Weight = 3
        .SeriesCollection(1).Border.Color = RGB(255, 0, 0)
    End With
    Wave.Close
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-3 17:43 | 显示全部楼层
perfect131 发表于 2023-2-3 14:32
chatgpt 给的代码 没测试

Sub Waveform()

感谢关注,真是拔出萝卜带出泥了,
卡在 Set Wave = CreateObject("sapi.spwave") 这句,
再搜 wave库 相关:
Windows音频采集及播放之wave库使用及实现
https://blog.csdn.net/lixiang987654321/article/details/109010053
又是C++啊

Python 从零开始制作自己的声音 - wave模块读写wav文件详解
https://blog.csdn.net/qfcy_/article/details/122755694
还是 Python

书到用时方恨少......

TA的精华主题

TA的得分主题

发表于 2023-2-3 20:13 | 显示全部楼层
aman1516 发表于 2023-2-3 17:43
感谢关注,真是拔出萝卜带出泥了,
卡在 Set Wave = CreateObject("sapi.spwave") 这句,
再搜 wave库  ...

期待大神开发VBA支持库
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-10 15:33 , Processed in 0.045302 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表