![Sox:读取 wav 并得到脉冲为 1、静音为 0 以及其持续时间(以微秒为单位)](https://linux22.com/image/1615712/Sox%EF%BC%9A%E8%AF%BB%E5%8F%96%20wav%20%E5%B9%B6%E5%BE%97%E5%88%B0%E8%84%89%E5%86%B2%E4%B8%BA%201%E3%80%81%E9%9D%99%E9%9F%B3%E4%B8%BA%200%20%E4%BB%A5%E5%8F%8A%E5%85%B6%E6%8C%81%E7%BB%AD%E6%97%B6%E9%97%B4%EF%BC%88%E4%BB%A5%E5%BE%AE%E7%A7%92%E4%B8%BA%E5%8D%95%E4%BD%8D%EF%BC%89.png)
我想这个问题的标题已经很清楚了。我想读取一个 wav 文件,并将脉冲设为 1,将静音设为 0,并获取其持续时间(以微秒为单位)。
原因是这样的,我录制了一个来自汽车导航系统的 433Mhz 解调信号(使用未知协议)。wav 被放大(剪辑)以拉直线条,并添加了 DC 偏移以使其成为完美的 PWM 方波(在 Audacity 中):
已经下载了 cli 应用程序sox
,但是选项太多了,真的不知道从哪里开始。当然,我也在网上搜索解决方案,但是什么也没找到。
三个问题:
- 我想要做的事有可能实现吗?
- 我需要使用哪些命令行选项?
- sox 能否完成我使用 Audicity 所做的事情(能够在批处理文件中自动执行该过程)?
输出示例(位,持续时间):
0,255
1,100
0,50
1,200
etc.
这些“表”可轻松用于在 C/C++ 中创建数组,并与微控制器一起使用,最终模拟遥控器。
有什么建议么?
答案1
我假设您的数据是某种文本文件,比如 CSV....读取 WAV 文件相当困难。您可能会在某处找到用于该步骤的 WAV 转 CSV 或 WAV 转 TXT 工具。
涉及一些小型编程,任何参加过几个月编程课程的人(即小孩)都可以轻松完成:)
您需要以微秒为单位抓取数据,并对这些样本执行 MAX() 和 MIN()。使用 VBA、C 或 Python 等语言执行此操作并不难。有更复杂的方法可以更准确地完成此操作,但我无法在 60 秒内写出任何方法。低于阈值的 MAX()-MIN() 应该可以工作
如果你关心之前的 3 个闪烁,它们最好在一微秒左右,以便于下一步轻松过滤
从前一个值开始计数连续的小值(低于阈值),这样就可以得到你想要的输出。由于你已经清理了一些数据,这个阈值应该是满量程的 1/2。打印 MAX 和 MIN 值几次,这样你就知道它们的近似值
还有简单的边缘检测程序,可以告诉你信号中每个波的准确频率(实际上只是周期)。只是更多的编码。
答案2
以下是导致解决方案的问题: https://stackoverflow.com/questions/42541588/any-way-i-can-get-sox-to-just-print-the-amplitude-values-from-a-wav-file
语法是:
sox file.wav -t dat file.txt
我想对于经常使用 sox 的人来说,这并不难理解。无论如何,这会生成一个文件,内容如下(时间位置 => 振幅):
; Sample Rate 44100
; Channels 1
0 0.99996948242
2.2675737e-005 0.99987792969
4.5351474e-005 0.99996948242
6.8027211e-005 0.99981689453
9.0702948e-005 0.99996948242
0.00011337868 0.99993896484
0.00013605442 0.99996948242
0.00015873016 0.99996948242
0.0001814059 0.99996948242
0.00020408163 0.99996948242
0.00022675737 0.99996948242
0.00024943311 0.99996948242
0.00027210884 0.99990844727
0.00029478458 0.99996948242
0.00031746032 0.99981689453
0.00034013605 0.99996948242
0.00036281179 0.99984741211
0.00038548753 0.99996948242
0.00040816327 0.99993896484
......
......
1.0236961 -0.0077819824219
1.0237188 -0.0081176757813
1.0237415 -0.0078735351563
1.0237642 -0.0079650878906
输出仍然需要一些工作,开头有一些奇怪的指数值,输出需要计算才能使用。我已经在 PHP 中做了一些解析。
很奇怪的是,获取波浪信息如此困难,网络上的大多数信息都是有限的、不完整的、过时的或不起作用的。