声波的最小表示?

Posted

技术标签:

【中文标题】声波的最小表示?【英文标题】:Minimal representation of a sound wave? 【发布时间】:2019-11-06 09:56:58 【问题描述】:

我想从音轨中提取一维单向量,简单地表示其在给定时间的“音量”或“强度”(我不确定这个术语)。

以一个可用的样本为例:

wget https://freewavesamples.com/files/Ensoniq-ESQ-1-Sympy-C4.wav

并将其转换为mono:

ffmpeg -i Ensoniq-ESQ-1-Sympy-C4.wav -acodec pcm_s16le -ac 1 -ar 44100 audio_test.wav

我从related Q&A thread收集到这种方式来可视化声波:

from scipy.io.wavfile import read
import matplotlib.pyplot as plt

input_data = read("audio_test.wav")
audio = input_data[1]

plt.plot(audio)
plt.ylabel("Amplitude")
plt.xlabel("Time")  
plt.title("Sample Wav")
plt.show()

“正”和“负”边相当对称,但并不完全。有没有办法将它们合并成一条“正面”线?如果是,如何从audio 变量中提取此类数据点?

非常感谢您的帮助!

【问题讨论】:

看来您要检测的是信号的包络。具体来说,正信封。 ***.com/questions/34235530/… 这里给出一个例子,使用 scipy。您可以轻松编写一些代码来创建正信封,然后显示它。 (由于存在术语问题,因此不标记为重复) 非常有帮助,谢谢,我在下面添加了我的解决方案。 【参考方案1】:

根据@anerisgreat 和同事的建议,我找到了这个解决方案(这对更大的音频样本更有意义):

wget https://file-examples.com/wp-content/uploads/2017/11/file_example_WAV_10MG.wav
ffmpeg -i file_example_WAV_10MG.wav -acodec pcm_s16le -ac 1 -ar 44100 audio_test.wav
from scipy.io.wavfile import read
import matplotlib.pyplot as plt

def positive_enveloppe(wav_dat):
    freq = wav_dat[0]
    pts = np.absolute(wav_dat[1])
    pos_env = np.zeros(len(pts) // freq + int(bool(len(pts) % freq)))

    env_idx, pts_idx = 0, 0
    while pts_idx < len(pts):
        sub_ar = pts[pts_idx:pts_idx+freq]
        mov_avg = np.mean(sub_ar)
        pos_env[env_idx] = mov_avg
        pts_idx += freq
        env_idx += 1

    return pos_env

input_data = read("audio_test.wav")
enveloppe_data = positive_enveloppe(input_data)
plt.plot(enveloppe_data)
plt.show()

产量:

【讨论】:

以上是关于声波的最小表示?的主要内容,如果未能解决你的问题,请参考以下文章

HAL库通过一个定时器实现多个超声波(HC-SR04)测距

心理声学基础

HAL实现多个超声波测距(输入捕获实现)

HAL实现多个超声波测距(输入捕获实现)

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距