【问题标题】:Python: ultrasonic to audio rangePython:超声波到音频范围
【发布时间】:2026-02-15 11:05:03
【问题描述】:

我正在使用 Python 2.7.3,我有一个与超声波频率有关的问题:

以 40MHz 采样,我测量一个超声波信号,它是 1MHz 谐振频率和一个包络的​​卷积 - 其包络取决于超声波信号传播的介质。我想听听这个收到的信号,我的问题是:

如何将接收到的信号映射到人类听觉范围内?或者换一种说法, 我该如何下采样并将此信号转换为音频频率(保持包络形状,甚至可能延长时间以使其更长)。

这里是模拟信号,但无论如何它通常是这样的:

import numpy as np
import matplotlib.pylab as plt

# resonant frequency is 1MHz
f     = 1e6
Omega = 2*np.pi*f

# samle at 40MHz or ts=25ns, for about 1000 samples: 
t = np.arange(0,25e-6,25e-9)
y = np.sin(Omega*t) * (t**2) * np.exp(-t/3e-6)
y /= max(y)

plt.plot(y)
plt.grid()
plt.xlabel('sample')
plt.ylabel('value')
plt.show()

【问题讨论】:

  • 波形是否总是具有恒定频率和函数包络的正弦波?
  • 更正我之前的评论:是的,底层(谐振)频率为 1MHz,采样频率始终为 40MHz - 两者都是常数,它是根据应用而变化的包络。

标签: python audio signal-processing


【解决方案1】:

您的问题有两个常见的答案:

  1. 只需以采样频率的一小部分播放即可。如果您播放信号,例如44.1 kHz 采样频率,您将听到大约 1000 Hz 的音调和大约 20 ms 的信号长度。 (我选择了 44.1 kHz,因为它肯定是任何硬件都可以播放的频率之一。)这可能最容易通过将信号保存到 WAV 文件中来完成(请参阅wave 模块),然后您可以使用任何播放 WAV 文件的东西。

  2. 标准方法是将谐振频率混合到可听频率。这是收音机的基本原理。从数学上讲,它涉及乘以接近谐振频率的载波频率,然后对结果进行低通滤波。该操作也可以被视为将频谱移近 0。但是,由于您的信号包络非常快(0.25 ms),这只会导致短暂的点击,因此在这里没有用处。

    李>

如果有进一步的要求,可以想出其他解决方案。包络频率和谐振频率似乎彼此比较接近,这限制了选择。如果您需要对实时信号执行此操作,那么挑战将是拉长包络,因为必须检测包络。否则无法延长时间。

【讨论】:

    【解决方案2】:

    我想对此发表评论,但我有一些例子。 有很多方法可以表示这一点。您可以使用声音作为编码媒介。 如果您的原始波形几乎没有属性,例如frequency(常数)和envelope(可变/可以近似),您可以例如以二进制形式对频率进行编码,并带有短的声音序列(@987654323 @),然后您可以用可变频率的恒定声音表示振幅(例如,100Hz 的声音表示 0 振幅,10000Hz 的声音表示最大振幅)。要重建原始包络,您可以使用插值。 我希望你能明白我的意思。

    【讨论】:

    • 这是一个有趣的想法 - 你有“启动代码”来实现它吗?