使用python写了一个测试麦克风阵列传递函数的demo,有需要的自取。该代码使用了第三方库ThinkDSP。
1. 传递函数
首先解释下什么是传递函数:
把具有线性特性的对象的输入与输出间的关系,用一个函数(输出波形的拉普拉斯变换与输入波形的拉普拉斯变换之比)来表示的,称为传递函数。
在麦克风阵列测试中,传递函数的输入和输出通常指标准测试信号和各麦克风接收到的信号。在音频信号中,传递函数通常指频域范围,所以需要对时域信号进行傅立叶变换(FFT)。
2. python中的传递函数
在scipy库中有一个函数类signal,其中有一个函数TransferFunction,该函数可用于计算两个变量之间的传递函数。
具体使用方法参考以下官方解释:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.TransferFunction.html
3. python实现
需要的库:
import thinkdsp
import wave
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
思路:
生成两个chirp信号s1和s2,把s1当作输入信号,把s2当作从某个mic获得的输出信号。两个信号仅振幅有差异,s2的振幅是s1的2倍。所以根据信号,传递函数=输出/输入,各频率段的传递函数数值应该为2。
第一步,生成两个信号。信号频率范围100Hz~8kHz,采样率16kHz。傅立叶变换后的矩阵元素是复数形式,而传递函数计算需要取实部。
s1 = thinkdsp.ExpoChirp(100,8000,1) #振幅为1
wav1 = s1.make_wave(1,0,16000)
w1 = wav1.make_spectrum()
fs = w1.fs
hs1 = w1.amps
s2 = thinkdsp.ExpoChirp(100,8000,2) #振幅为2
wav2 = s2.make_wave(1,0,16000)
w2 = wav2.make_spectrum()
hs2 = w2.amps
第二步,计算传递函数。
s12 = signal.TransferFunction(hs2,hs1)
plt.figure('TransferFunction')
plt.plot(fs,s12.num/s12.den)
plt.ylim(0,3)
plt.show()
print('finish')
生成图像,整个频率段的 「输出/输入」传递函数值均为2,符合预设。
注意,传递函数并不是简单的 输出/输入,其中做的信号处理都已经在函数TransferFunction中完成,可在参考文档中自行研究。