✨ 长期致力于主动噪声控制、宽窄带混合系统、前反馈混合系统、非线性环境、不相干噪声、脉冲噪声研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)提出IHANC系统改进权重向量更新公式以增强窄带噪声衰减能力:
在传统宽窄带混合HANC系统中,窄带子系统的权重更新采用归一化FxLMS算法。IHANC引入可调节参数λ,将更新公式修改为w(k+1)=w(k)+μ*e(k)*x(k)/(λ+||x(k)||^2),λ取值范围零点零一至零点一。通过调节λ,可在收敛速度与稳态误差之间折衷。在仿真中,宽窄带混合噪声包含一百赫兹、三百赫兹两个窄带分量与二百至八百赫兹宽带噪声。IHANC系统使窄带分量衰减额外提高六点三分贝,总降噪量达到二十八分贝。同时,抗脉冲干扰能力通过引入误差信号压缩函数Φ(e)=sign(e)*log(1+β|e|)实现,β设为二。在脉冲噪声概率百分之五的环境下,IHANC系统稳定性优于传统HANC。
(2)设计小波包与FLANN滤波器结合的非线性混合结构IHFLANN系统:
针对非线性环境,将宽带子系统中的自适应滤波器替换为小波包分解加FLANN结构。小波包将参考信号分解为四个子带,每个子带使用FLANN滤波器进行非线性扩展,扩展阶数为三阶,产生原始信号与平方、立方项。窄带子系统仍使用FLANN滤波器。进一步引入M-max选择器降低计算复杂度,每次更新仅选取绝对值最大的M个系数进行更新,M设为总系数的百分之三十。在扬声器与误差麦克风之间存在非线性失真(总谐波失真百分之十)的仿真环境中,IHFLANN系统对宽窄带混合噪声的降噪量达到二十二点一分贝,而传统HFLANN只有十七点三分贝。SIHFLANN系统计算量减少百分之四十,降噪性能仅下降零点八分贝。
(3)提出基于凸组合与误差信号分离的FLANN-ECHANC系统:
在凸组合算法基础上,添加误差信号压缩函数与参考信号约束函数,形成C-IFXtanh LMS算法,抗脉冲能力增强。将两个自适应滤波器通过凸组合权重λ组合,整体输出为y=λ*y1+(1-λ)*y2,λ通过sigmoid函数自适应调节。然后增加反馈结构处理不相干噪声,反馈滤波器使用FLANN。误差信号分离子系统将误差麦克风信号分解为前馈相关部分与反馈相关部分,解决耦合问题。在实车噪声环境(发动机转速两千转每分钟,车内混响时间零点五秒)下进行试验,EC-HANC系统(非凸组合版本)的降噪比达到负一点二分贝,而FLANN-ECHANC系统在非线性环境下达到负一点八分贝。以dSPACE DS1104为控制器,搭建开放空间试验平台,使用模拟噪声(白噪声加正弦)验证,所提算法在脉冲环境下收敛稳定,平均降噪量二十二点五分贝。
import numpy as np class IHANC: def __init__(self, len_filter, mu=0.01, lam=0.05, beta=2.0): self.w = np.zeros(len_filter) self.mu = mu self.lam = lam self.beta = beta def compress_error(self, e): return np.sign(e) * np.log(1 + self.beta * np.abs(e)) def update(self, x, e): # x: 参考信号向量 e_comp = self.compress_error(e) norm_x2 = np.dot(x, x) delta_w = self.mu * e_comp * x / (self.lam + norm_x2) self.w += delta_w return np.dot(self.w, x) class FLANN: def __init__(self, n_inputs, order=3): self.n_inputs = n_inputs self.order = order self.w = np.zeros(n_inputs * (order+1)) def expand(self, x): # x: 标量 expanded = [x**p for p in range(1, self.order+2)] return np.array(expanded) def predict(self, x_seq): out = 0 idx = 0 for x in x_seq: exp = self.expand(x) out += np.dot(self.w[idx:idx+len(exp)], exp) idx += len(exp) return out def convex_combination(u1, u2, alpha): # alpha 通过sigmoid控制 lam = 1 / (1 + np.exp(-alpha)) return lam * u1 + (1-lam) * u2 if __name__ == '__main__': # IHANC测试 ihanc = IHANC(len_filter=32, mu=0.005, lam=0.03) x_test = np.random.randn(1000) e_test = np.random.randn(1000) * 0.1 outputs = [] for i in range(32, len(x_test)): x_vec = x_test[i-32:i] y = ihanc.update(x_vec, e_test[i]) outputs.append(y) print(f'IHANC输出均方根: {np.sqrt(np.mean(np.square(outputs))):.3f}') # FLANN非线性扩展 flann = FLANN(n_inputs=2, order=2) test_seq = [0.5, -0.3] pred = flann.predict(test_seq) print(f'FLANN预测值: {pred:.3f}') # 凸组合 u1_out = 0.2 u2_out = 0.5 alpha_val = 1.0 combined = convex_combination(u1_out, u2_out, alpha_val) print(f'凸组合输出: {combined:.3f}')