[英]Python histogram of RMS amplitude of audio file
我想制作一個直方圖,將音頻文件的RMS 幅度分檔。 目標是在文件的整個持續時間內顯示每個幅度級別的信號量。 是否有 Python package 和 function 用於此? 如果不是,如何編碼?
我還想設置計算分析的頻率范圍,例如在 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()
據我所知,在 numpy 中沒有專門的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()
在這里你也可以應用一些信號 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.