【问题标题】:Python histogram of RMS amplitude of audio file音频文件RMS幅度的Python直方图
【发布时间】:2021-03-12 19:18:36
【问题描述】:

我想制作一个直方图,将RMS amplitude 分箱为音频文件。目标是在文件的整个持续时间内显示每个幅度级别的信号量。是否有具有此功能的 Python 包?如果没有,怎么编码?

我还想设置计算分析的频率范围,例如在 1 到 6 kHz 之间。

我有以下粗略的开始,虽然我还不明白它代表什么,而且它肯定不使用 RMS:

import numpy as np
import matplotlib.pyplot as plt
   
Fs, data = wavfile.read('file') 
print('data =',data)
print('number of samples in data =',len(data))

subset = data[0:44100] 
subset = abs(subset)
print('number of samples in subset =',len(subset))

plt.hist(subset, bins='auto')  
plt.show()

【问题讨论】:

  • 你能包含plt.show() 显示的内容吗?另外,你在使用 scipy 的 wavfile.read 函数吗?如果是这样,请确保导入 scipy。

标签: python audio histogram rms amplitude


【解决方案1】:

据我所知,numpy 没有针对 RMS 的特殊功能,但你可以这样做

RMS = np.sqrt(np.mean(x**2))

问题是,您要为哪些数据(x)计算 RMS。 例如,您可以为每个样本应用 RMS,而不是假设您的 wav 文件中只有一个通道:

length = data.shape[0] / Fs
print(f"length = {length}s")

RMS = lambda x: np.sqrt(np.mean(x**2))

sample = np.arange(int(length))
RMS_of_sample = np.zeros(sample.shape)
for ns in sample:
    # here you can apply the frequency window for the sample 
    RMS_of_sample[ns] = RMS(data[ns*Fs:(ns+1)*Fs])

plt.hist(RMS_of_sample, label="Left channel")
plt.show()

在这里你也可以申请一些signal windows。 这段代码给你这样的东西

对于输入信号:


评论中关于全/部分频率范围的问题的补充

如果你想在某个频域分析一个完整的信号,你可以像这样对频率范围[filter_freq_min, filter_freq_max]应用简单的滤波器(矩形频率窗口):

from scipy.fft import fft, ifft, fftfreq

filter_freq_min = 1000 # Hz
filter_freq_max = 2000 # Hz

freq = fftfreq(len(data), 1 / Fs)
data_fft = fft(data)

condition = np.logical_or(abs(freq) <= filter_freq_min, abs(freq) >= filter_freq_max)
filtered_data_fft = np.copy(data_fft)
filtered_data_fft [condition] = 0
filtered_data = np.real(ifft(filtered_data_fft ))

# show fft for incoming signal (blue) and filtered signal (orange) 
plt.plot(freq, np.abs(data_fft),'.')
plt.plot(freq, np.abs(filtered_data_fft ),'.')
plt.xlim( [10, Fs/2] )
plt.xlabel( 'Frequency (Hz)' )
plt.show()

# check RMS for filtered and unfiltered signal
print(RMS(filtered_data),RMS(data))

通过这种方式,您可以在所需的频率范围内循环。

要在 Python 中直接播放声音,可以使用

import sounddevice as sd # For playing/recording audio
sd.play(data, Fs)
sd.play(filtered_data, Fs)

【讨论】:

  • 谢谢!当我不加调整地应用此代码时,我的直方图只有一个条,我假设这意味着我的 bin 大小等于整个频率范围。如何使每个条形图在频率的对数标度上按比例相等的频率箱中表示 RMS 幅度?例如,每个 bin 等于一个八度或五分之一?
  • 也许我的答案中的添加将帮助您为每个频率范围内的完整信号创建一个 RMS 直方图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2011-08-18
  • 2016-12-12
相关资源
最近更新 更多