微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有一种简单的方法可以找到声音信号中包络的频率?

如何解决有没有一种简单的方法可以找到声音信号中包络的频率?

我有一个 5 秒长的声音信号,它来自螺旋桨的声音。我需要通过找到包络的频率来找到螺旋桨的转速。

import wave
import numpy as np
import matplotlib.pyplot as plt

raw = wave.open('/content/drive/MyDrive/Demon.wav','r')
signal = raw.readframes(-1)
signal = np.frombuffer(signal,dtype="int16")
frate = raw.getframerate()

time = np.linspace(0,len(signal) / frate,num = len(signal))

plt.figure(1)
plt.title("Sound Wave")
plt.xlabel("Time")

plt.plot(time,signal)
plt.show()

这是声音文件本身的链接https://sndup.net/5v3j

由于它是一个 5 秒长的信号并且有 80.000 个样本,我想通过查看信号的 1 秒部分来详细了解它。

partial_signal = signal [1 : 16000]
partial_time = time[1 : 16000]
plt.plot(partial_time,partial_signal)
plt.show()

图的输出如下所示。

Output

编辑:看起来图像不会显示在这里是图像的链接https://imgur.com/P5lnSM1 现在我需要使用 only python 来找到包络的频率,即螺旋桨的 rpm。

解决方法

您可以通过对信号幅度应用快速傅立叶变换 (FFT) 轻松实现这一点。下面是一个例子:

import wave
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import rfft,rfftfreq
from scipy.ndimage import gaussian_filter

raw = wave.open('Demon.wav','r')
signal = raw.readframes(-1)
signal = np.frombuffer(signal,dtype="int16")
frate = raw.getframerate()
time = np.linspace(0,len(signal) / frate,num = len(signal))


# Compute the amplitude of the sound signal
signalAmplitude = signal.astype(np.float64)**2

# Filter the signal to remove very short-timed amplitude modulations (<= 1 ms)
signalAmplitude = gaussian_filter(signalAmplitude,sigma=frate/1000)

# Compute the frequency amplitude of the FFT signal
tmpFreq = np.abs(rfft(signalAmplitude))

# Get the associated practical frequency for this signal
hzFreq = rfftfreq(signal.shape[0],d=1/frate)

finalFrequency = hzFreq[1+tmpFreq[1:].argmax()]
print(finalFrequency)


# Show sound frequency diagram
plt.xticks(np.arange(21))
plt.xlim([1,20]) # Show only interesting low frequencies
plt.plot(hzFreq,tmpFreq)
plt.show()

频率图如下: enter image description here

最终检测到的频率为 3.0 Hz,与我们听到的非常一致。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?