使用python计算麦克风阵列信号的传递函数

使用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中完成,可在参考文档中自行研究。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值