自适应滤波器做啸叫检测

%啸叫频点的检测
%啸叫位置不确定时的抑制方法
%初始条件设置
fs=44100;           %采样频率:44.1kHz
duration=1;         %音频时长1s
%保存的语音信号路径及名称
filename_howling_random='D:\\project_record\\speech_random_howling.wav';
filename_adapfilter_random='D:\\project_record\\speech_adapfilter_howling.wav';
speech_howling=audioread(filename_howling_random);
video_len=length(speech_howling);

%自适应滤波器需要参考信号,可以是标准的音频信号也可以是误差信号的线性变换
%本次输入的参考信号是误差信号
%因此最终的输出信号也是误差信号
%输出的误差才是滤波后的信号

[speech_howling,~]=audioread(filename_howling_random);
%信号截取的参数设定
%设定更新速度:
%每20ms更新(查看资料介绍,一般10ms~20ms更新速度较为适宜)
updRate=floor(20*fs/1000);         
 %设置帧长,单位ms
%40ms一帧,这样一帧内的音频信号可以近似看作是平稳的信号
t_zhen=40; 
fRate=fix(t_zhen*fs/1000);            
%求取样本点个数
n_samples=length(speech_howling);
%计算帧数
nFrames=fix(n_samples/updRate)-1; 
%初始化参数
n=1;
flag_zhen=0;
max_temp=0;
for t=1:nFrames
   if(n+fRate<=n_samples)
       zhen=speech_howling(n:n+fRate-1);
       Y_zhen=abs(fft(zhen));
       P_zhen=Y_zhen.^2;
       P_zhenaver=mean(P_zhen);
       [P_max,P_index]=max(P_zhen);
       if(10*log10(P_max)-10*log10(P_zhenaver)>10)
           if(max_temp==P_index)
             flag_zhen=flag_zhen+1;
           else
            flag_zhen=0;
            max_temp=P_index;
           end
       end    
       n_zhen=0:(fRate-1);
       N_zhen=fRate;
       f_zhen=n_zhen*fs/N_zhen;
       %每一帧画图,若想观察每一帧的频谱则取消注释
       %figure(t+1)
       %plot(f_zhen(1:fix(N_zhen/2)),Y_zhen(1:fix(N_zhen/2)));
       n=n+updRate;
   end
end
if(flag_zhen>=15)
    f_howling=(max_temp-1)*1000/t_zhen;
    disp('howling frequency is(Hz):')
    disp(f_howling);
end


%自适应滤波器的初始化 
%定义FIR滤波器阶数,一个频点需要二阶
M = 2;                                   
step = 0.1;                                %算法调节步长控制因子
y_out = zeros(video_len,1);              %滤波器输出
error_out = zeros(video_len,1);          %误差输出            
w_out = zeros(video_len,M);              %系数输出
t=(0:1:video_len-1)/video_len;%时间轴单位s

for i=1:video_len
    %数据输入
    if i == 1           %如果是第一次进入
        w = zeros(M,1); %初始化滤波器抽头系数
        x = zeros(M,1); %初始化信号向量
    end
    d = speech_howling(i);                     %输入新的期望信号
    x = [sin(2*pi*f_howling*(i-1)/fs)
         cos(2*pi*f_howling*(i-1)/fs)];                 %输入新的信号矢量
    %算法正体
    y = x' * w;                              %计算滤波器输出
    error = d - y;                           %计算误差
    w_forward = w + step * error * x;         %计算滤波器系数向量
    %变量更替
    w = w_forward;
    %滤波结果存储
    %其中y_out是啸叫信号
    %error_out是滤波后的音频信号
    %w_out是二阶滤波器参数
    y_out(i) = y;
    error_out(i) = error;
    w_out(i,:) = w';
end
 audiowrite(filename_adapfilter_random,error_out,fs);
sound(error_out,fs);
figure;
%=======时域图像======
t=(0:1:video_len-1)/video_len*duration;%时间轴单位s
subplot(2,1,1);
plot(t,error_out);
title('滤波后音频信号时域图像');
xlabel('时间:s');
grid on;
%=======频域图像======
n=0:video_len-1;        
N=video_len;           
Y1=fft(error_out,N);    
mag=abs(Y1);            
f=n*fs/N;               
%取1/2作图
subplot(2,1,2);
plot(f(1:fix(N/2)),mag(1:fix(N/2)));
title('滤波后音频信号频谱图');
xlabel('频率/Hz');      
ylabel('幅度');         
grid on;    
%画出FIR滤波器的零极点图

FPGA(现场可编程门阵列)的啸叫检测与抑制系统设计是一种用于检测并减少噪音、啸叫和干扰的技术,该技术广泛应用于声音处理、通信系统和无线电设备中。 在这个系统中,FPGA是关键的处理单元,它通过采集和分析信号来检测是否存在啸叫。首先,系统需要将输入信号进行采样和滤波处理,以去除高频噪声和啸叫。随后,FPGA使用数字信号处理算法对滤波后的信号进行分析,并判断是否存在啸叫。 一旦检测啸叫,FPGA将采取相应的措施来抑制它。其中一种常见的方法是使用自适应滤波算法。该算法根据检测到的啸叫频率和幅度调整滤波器的参数,以实现最佳的抑制效果。另外,FPGA还可以通过动态增益控制和相位调整来进一步减少啸叫的影响。 设计这个系统需要考虑如下几个关键因素。首先是采集和滤波的采样率和精度,如果采样率过低或精度不够高,可能会导致对啸叫检测不准确。其次是算法的选择和优化,需要根据具体应用场景和要求来选择最适合的检测和抑制算法。此外,系统还需要合理的输入和输出接口设计,以适应实际应用环境。 总之,FPGA的啸叫检测与抑制系统设计是一项在声音处理和通信领域有着广泛应用的技术。通过采用适当的算法和参数配置,该系统能够有效地检测和抑制啸叫,从而提高音频质量和通信可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值