延时取整之后,麦克风阵列丢掉了什么?

发布时间:2026/9/28 21:07:42
延时取整之后,麦克风阵列丢掉了什么? 上一篇在每个频点上做相位补偿目标方向的增益可以保持为 1。把这套处理搬到离散音频上第一个问题就来了需要补偿的延时往往不是整数。沿用 8 元线阵、3.5 cm 间距采样率取 16 kHz。目标从 20° 入射相邻麦克风的到达时间只差0.5584 个采样点。取成 1误差不到半个采样点看起来不大。但在 6.5 kHz这组阵列的目标幅度已经下降了1.95 dB。方向没有估错阵元也没有误差损失就来自延时取整。图 1目标方向的幅度响应。两种实现使用相同传播模型和指向分数延时采用 65 抽头窗化 sinc FIR。理想补偿为 0 dB。灰色区域超出试听信号的主要频带用来观察接近 Nyquist 频率时的变化。这次把问题往前推进一步真正生成多通道时域信号比较整数延时、分数延时 FIR以及 STFT 子带相位补偿。除了输出 SINR还单独测目标失真。代码附带合成扫频音频可以对照试听它不包含真实语音不能据此判断可懂度或语音识别率。先给所有通道留出共同延时仍以第 0 个麦克风为参考角度相对阵列法线定义。目标在第 m 路的到达延时用采样点表示为δ m f s m d sin ⁡ θ s c . \delta_m\frac{f_smd\sin\theta_s}{c}.δm​cfs​mdsinθs​​.取 c343 m/s、θₛ20°八路延时依次为0.0000 0.5584 1.1168 1.6752 2.2336 2.7920 3.3504 3.9088目标在后面的麦克风上更晚到达直接把它们向前移需要未来的样本。时域实现可以给所有通道加一个共同延时 D再让第 m 路补偿q m D − δ m . q_mD-\delta_m.qm​D−δm​.本文取 D32 个采样点。这样理想目标输出为 s[n−32]相对参考麦克风延后 2 ms各路所需补偿落在 28.0912 到 32 个采样点之间。这里的 2 ms 是为了对齐而设置的共同延时。后面 STFT 实验还涉及帧缓存和输出调度不能把这个数字当成整套系统的端到端延迟。半个采样点会变成多大的相位误差整数延时把 qₘ 取成最近的整数。目标经过传播和补偿后相对共同延时 D 的残差为ϵ m δ m round ⁡ ( D − δ m ) − D . \epsilon_m\delta_m\operatorname{round}(D-\delta_m)-D.ϵm​δm​round(D−δm​)−D.各路都相对第 0 路计算后分别取整不能把相邻时差取整再沿阵列累加。这一组补偿量取整后是[32,31,31,30,30,29,29,28]。残差绝对值最大约为 0.4416 个采样点。在频率 f 处这个误差对应的相位偏差为 2πfεₘ/fₛ。对 6.5 kHz 而言0.4416 个采样点已经约等于64.6°。八路目标不再完全同相平均之后自然会变小。去掉共同延时对应的线性相位整数延时的目标响应为B i n t ( f ) 1 M ∑ m 0 M − 1 exp ⁡ ( − j 2 π f f s ϵ m ) . B_{\mathrm{int}}(f)\frac{1}{M}\sum_{m0}^{M-1} \exp\left(-j\frac{2\pi f}{f_s}\epsilon_m\right).Bint​(f)M1​m0∑M−1​exp(−jfs​2πf​ϵm​).图 1 的蓝线就是这条式子。它不是噪声实现的偶然结果也不需要生成任何随机信号只要知道阵列几何、采样率和指向就能算出来。因此检查延时量化时不要只看“误差不到一个采样点”。应该把误差换成最高工作频率处的相位再看所有阵元的复响应如何相加。平均相位偏移和阵元间相位分散都会进入结果。用一段 FIR 近似非整数延时理想 qₘ 点延时的离散时间频率响应为 exp(−jωqₘ)。在主值频带内它对应无限长的 sinc 冲激响应。实际实现必须截断。这里采用一个可以直接复现的基线长度 65、对称 Hamming 窗、逐通道直流归一化滤波器为h m [ n ] sinc ⁡ ( n − q m ) v [ n ] ∑ r 0 64 sinc ⁡ ( r − q m ) v [ r ] , n 0 , … , 64. h_m[n] \frac{\operatorname{sinc}(n-q_m)v[n]} {\sum_{r0}^{64}\operatorname{sinc}(r-q_m)v[r]}, \qquad n0,\ldots,64.hm​[n]∑r064​sinc(r−qm​)v[r]sinc(n−qm​)v[n]​,n0,…,64.其中 sinc(x)sin(πx)/(πx)v[n]0.54−0.46cos(2πn/64)。输出为y [ n ] 1 M ∑ m 0 M − 1 ( h m ∗ x m ) [ n ] . y[n]\frac{1}{M}\sum_{m0}^{M-1}(h_m*x_m)[n].y[n]M1​m0∑M−1​(hm​∗xm​)[n].目标各路的总延时接近 δₘqₘD因而重新对齐。有限长度意味着频率响应只是在工作频带内逼近理想延时。图 1 中这个 FIR 在 6.5 kHz 的目标幅度误差约为 −0.003 dB继续向 Nyquist 频率靠近误差会增大。65 抽头只是本次实验选择没有做最小阶数优化。若要控制群时延、通带纹波或动态更新延时可以进一步比较等波纹设计、Farrow 结构等方法。MathWorks 的分数延时 FIR 设计说明给出了相关设计路线。还有一个实验细节多通道传播没有用这套 FIR 来生成。目标和干扰都是可在连续时间直接求值的扫频函数在 t−τₘ 处计算各路样本。这样不会让“生成信号的插值器”和“待评价的插值器”共用同一个近似。STFT每个频点乘相位还差哪一步另一种常见实现是先分帧、加窗、FFT再对每个频点补偿相位。对于第 ℓ 帧、第 k 个频点代码实际相乘的系数为Y ℓ [ k ] 1 M ∑ m 0 M − 1 X m , ℓ [ k ] exp ⁡ ( j ω k δ m ) . Y_\ell[k]\frac{1}{M}\sum_{m0}^{M-1} X_{m,\ell}[k]\exp(j\omega_k\delta_m).Yℓ​[k]M1​m0∑M−1​Xm,ℓ​[k]exp(jωk​δm​).这对应首篇的 wᴴx 写法。这里已经把共轭展开到了乘数里所以相位符号为正。处理完后再给整个输出附加 D 点共同延时方便与时域方法对齐比较。但这一步通常只是子带近似。用连续时间 STFT 记号平移信号满足X m ( u , f ) e − j 2 π f τ m S ( u − τ m , f ) . X_m(u,f)e^{-j2\pi f\tau_m}S(u-\tau_m,f).Xm​(u,f)e−j2πfτm​S(u−τm​,f).相位补偿消掉了指数项剩下的是 S(u−τₘ,f)而非同一帧中心 u 上的 S(u,f)。把它们直接相加隐含了相邻帧时刻的局部谱变化足够小这一条件。从时域看问题也一样移动一段已经加窗的信号会同时移动窗。先移动原信号再加窗与先加窗再移相并不完全相同。帧内 FFT 相位旋转还有循环移位的边界效应不能直接当成无限长信号的理想延时。本例最大到达时差为 3.9088 点约 0.244 ms相对 16 ms 帧长很短。因此子带近似能做得相当好若帧长缩到 4 ms误差就会明显上升。图 2左所需补偿延时与整数近似。右改变 STFT 帧长后的目标 NMSE越低越好。所有帧长均使用周期 Hann 窗、75% 重叠及窗平方和归一化。虚线是固定 65 抽头 FIR 的结果。重构也要单独检查。本文的分析窗和合成窗都为 g[n]按下式加权重叠相加y ^ [ n ] ∑ ℓ g [ n − ℓ H ] y ~ ℓ [ n − ℓ H ] ∑ ℓ g 2 [ n − ℓ H ] . \widehat y[n] \frac{\sum_\ell g[n-\ell H]\widetilde y_\ell[n-\ell H]} {\sum_\ell g^2[n-\ell H]}.y​[n]∑ℓ​g2[n−ℓH]∑ℓ​g[n−ℓH]y​ℓ​[n−ℓH]​.这里 HL/4 是帧移分母在有效样本处必须非零。脚本对首尾补零确保样本被完整覆盖否则仅仅在中间区域满足重叠条件也可能丢掉边界样本。关于 NOLA 条件和边界覆盖可参考 SciPy 的 STFT 文档。先把所有补偿量设为零验证 STFT→ISTFT 能还原通道平均信号。本文最大绝对误差为 8.88×10⁻¹⁶接近双精度舍入水平。再打开延时补偿测到的目标误差才有理由归因于处理本身。实数音频还有一个细节DC 和 Nyquist 点必须保持实数。代码使用有符号的完整 FFT 频率序列并把 Nyquist 点的补偿系数取实部。本例信号主要频率低于 6.5 kHz不把靠近 8 kHz 的效果纳入主要结论。三种实现放到同一段宽带信号上测试音长 4 s采样率 16 kHz。目标包含两条向上扫频分量干扰是一条向下扫频分量两者都带平滑幅度调制。它们在时间—频率平面上相交便于观察目标与干扰分别发生了什么。阵列参数与首篇一致目标 20°干扰 −35°。第 0 路的全段目标功率归一化为 1干扰功率为 10各通道加入单位方差的独立高斯白噪声随机种子固定为 20260927。图 3参考目标、第 0 路麦克风以及整数和分数延时输出的时频图。四幅图使用同一色标输出图已补偿共同延时。参考目标中的向上轨迹便于辨认混合输入里额外的向下轨迹来自干扰。图像边缘包含补零和滤波起止过程指标计算避开了这些区域。评价时对三种方法分别处理目标分量和干扰加噪声分量。后者只是仿真中的指标计算方法实际波束形成器仍处理混合输入不需要访问干净目标。输出 SINR 的定义为S I N R o u t 10 log ⁡ 10 ∑ n y s 2 [ n ] ∑ n y v 2 [ n ] . \mathrm{SINR}_{\mathrm{out}} 10\log_{10}\frac{\sum_n y_s^2[n]}{\sum_n y_v^2[n]}.SINRout​10log10​∑n​yv2​[n]∑n​ys2​[n]​.另外把处理后的目标与共同延时对齐的参考目标比较定义N M S E s 10 log ⁡ 10 ∑ n ∣ y s [ n ] − s [ n − D ] ∣ 2 ∑ n ∣ s [ n − D ] ∣ 2 . \mathrm{NMSE}_s 10\log_{10} \frac{\sum_n|y_s[n]-s[n-D]|^2} {\sum_n|s[n-D]|^2}.NMSEs​10log10​∑n​∣s[n−D]∣2∑n​∣ys​[n]−s[n−D]∣2​.这里不做额外的最优幅度缩放也不通过搜索延时去替算法纠正残差。否则一部分幅度或时延失真会被评测步骤掩盖。目标 NMSE 是“仅目标经过处理”的误差不是含噪输出相对干净信号的误差。为避开边界评分使用从 D2400 到 N−2401 的输出样本从 0 编号与对应的 s[n−D] 比较。输入 SINR 也在同一参考时间区间计算因此为 −10.29 dB略有别于全段功率设定对应的 −10.41 dB。实现输出 SINR目标 NMSE目标功率增益整数延时1.40 dB−20.84 dB−0.483 dB65 抽头分数延时 FIR5.85 dB−80.35 dB−0.00010 dBSTFT256 点帧长5.83 dB−65.23 dB−0.00476 dB图 4左边比较输出 SINR右边比较目标保真度。为便于看柱高右图画的是 −NMSE越高越好。所有数字来自这一段合成信号和一个固定噪声实现没有统计置信区间。整数延时的 SINR 比分数延时低约 4.45 dB。这个差值同时包含目标衰减和干扰响应改变不能全部解释为目标丢失。单独看目标 NMSE才看得出取整还改变了目标波形。分数延时 FIR 和 STFT 的 SINR 很接近目标 NMSE 却相差约 15 dB。在这组理想输入上残留干扰和噪声已经主导了输出 SINR进一步降低目标失真未必能在这个指标上体现出来。这也是只报一项“增强效果”容易漏掉的信息。这里 −80 dB 的目标 NMSE 也不是房间里的语音质量保证。实验没有混响、麦克风标定误差和 DOA 误差目标函数平滑且频带受控换成实际录音应重新核对参考信号定义和误差来源。帧长增加不能只记住误差下降把 STFT 帧长从 64 点增加到 1024 点在本例中得到帧长时间长度目标 NMSE64 点4 ms−41.22 dB128 点8 ms−53.20 dB256 点16 ms−65.23 dB512 点32 ms−77.27 dB1024 点64 ms−89.31 dB长窗降低了当前实验的处理误差1024 点时甚至低于固定 65 抽头 FIR。两者的资源预算并不相同这个结果不能推出“STFT 总比 FIR 准”。本次 STFT 使用离线补零和完整帧处理没有实现实时环形缓冲也没有测端到端延迟。帧长变大后帧缓存等待和输出调度需要重新设计遇到移动声源权重更新时间与帧内方向变化也要纳入实验。只看这一列 NMSE就无法替流式系统选出合适帧长。复现时可以先做两个改动把整数延时的采样率提高同时保持物理阵列不变或者固定 16 kHz缩短分数延时滤波器。这两组实验分别检查采样分辨率和滤波器长度的代价控制变量比直接更换整套算法更清楚。代码与试听配套目录包含 Python 和 MATLAB/Octave 实现。Python 负责生成连续时间函数采样得到的多通道输入、全部效果图和 WAV 文件MATLAB/Octave 读取同一份输入独立构造 FIR、整数延时和 WOLA 处理逐样本检查输出避免随机输入不同干扰对照。试听文件采用同一缩放系数没有把每段音频分别归一化。target.wav为干净合成目标mic0.wav为输入integer.wav、fractional.wav、stft256.wav为三个输出。它们是扫频测试音试听时从较低音量开始末尾因延时对齐补入的 32 个零样本不参与评分。MATLAB 代码已经在 GNU Octave 10.3.0 执行验证这不等于商业 MATLAB 实机测试。完整运行命令和跨语言误差记录见配套说明。下一篇换掉本系列一直沿用的独立白噪声假设如果噪声在麦克风之间相关8 元阵列的 9 dB 白噪声增益还剩多少我们从扩散声场的空间相干矩阵开始算。