在特定音频频率下寻找能量的滤波器设计

2024-10-01 07:44:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在修改和扩展由meinardmüller和sebastienewert编写的Matlab“Chroma Toolbox”,并将其扩展到python。它的目的是检测在音频记录的每个分析帧中出现的音乐音调。在

第一步是确定音乐的调音,色度工具箱测试音乐是否调到标准A=440Hz,或者调低四分之一、三分之一、一半、三分之二或四分之三的半音。这没关系,但在我的应用程序中,我需要在调优检测中提高分辨率。在

一旦从其中一个选项中选择了调音,就会选择一个相应的滤波器组,该滤波器组用于计算钢琴范围内每个音高处有多少能量。(同时,波形重新采样至22050、4410和882赫兹)

filterbank的系数存储在.mat文件中,由Chroma工具箱提供。例如,在标准调谐中间C(261.63hz)处检测能量的系数为b=[1.,-7.43749873,24.72954997,-47.94740681,59.25189976, -47.77885707,24.55599193,-7.35933913,0.98601284]和a=[0.00314443,-0.02341175,0.07794208,-0.15134062,0.18733283,-0.15134062,0.07794208,-0.02341175,0.00314443],中间C的采样率为4410Hz。在

这些系数在filterfilt调用中使用:我使用scipy.signal.filtfilt公司(b,a,x)其中x是适当采样频率下的波形,低为低音符,高音符为高音符。此步骤在“audio_to_pitch_via_FB.m”文件中完成。在

问题是:

因为我想允许不同于色度工具箱中设计的调谐水平,所以我需要制作自己的滤波器组,因此需要知道如何计算滤波器系数。为此,我需要一个函数coeffs(freq,fs),它将找到合适的系数,以找到给定频率下的能量,对于采样频率fs的信号。我该怎么做?在

以下是其中一个.mat文件的名称,以防其中包含有用的线索。”音高60度96度22050度Q25_minusQuarter.mat““


Tags: 文件标准音乐工具箱fs频率能量音符
1条回答
网友
1楼 · 发布于 2024-10-01 07:44:18

生成过滤器的代码在generateMultiratePitchFilterbank.m文件中。ellip函数以相反的方式返回a和b,但在其他方面或多或少是相同的。在

以下配方复制了您引用的数字:

import numpy as np
import scipy.signal as ss

def coeffs(pitch, fs, Q=25, stop=2, Rp=1, Rs=50):
    """Calculate filter coeffs for a given pitch and sampling rate, fs.
    See their source code for description of Q, stop, Rp, Rs"""
    nyq = fs/2.                       # Nyquist frequency
    pass_rel = 1/(2.*Q)             
    stop_rel = pass_rel * stop

    # The min-max edges of the pass band
    Wp = np.array([pitch - pass_rel*pitch, pitch+pass_rel*pitch])/nyq
    # And the stop band(s)
    Ws = np.array([pitch - stop_rel*pitch, pitch+stop_rel*pitch])/nyq

    # Get the order, natural freq
    n, Wn = ss.ellipord(Wp, Ws, Rp, Rs)

    # Get a and b:
    a, b = ss.ellip(n, Rp, Rs, Wn, btype="bandpass")

    return a, b

相关问题 更多 >