带噪声音信号的产生(MATLAB)

您所在的位置:网站首页 白噪音文件下载 带噪声音信号的产生(MATLAB)

带噪声音信号的产生(MATLAB)

2023-12-27 12:44| 来源: 网络整理| 查看: 265

带噪声音的产生方式-MATLAB 前言摘要噪声程序的叠加声音信号叠加指定信噪比的高斯白噪声将噪声数据文件的数据叠加生成任意信噪比的带噪声音信号 程序测试扫频信号叠加高斯白噪声实际玻璃破碎声叠加实地采集到的背景噪声 总结

前言

最近在做关于声音信号的加噪实验,虽然根据网络上流传的加噪程序也仿写了一个,但是在众老师的火眼金睛下,还是发现了错误,这个程序困扰了我好长一段时间,不过这件事情也让我知道程序验证是多么的重要。写这篇博客主要目的是能够给相关领域的初学者提供一个思路,大家一起讨论,共同学习。本博客涉及的程序在GitHub上有仓库,需要请前往下载Github

摘要

带噪声音是由纯净声音和混叠的噪声一起形成的,而噪声可以是加性的也可以是非加性的。对于非加性噪声可以通过变换转化为加性噪声,例如成性噪声或者卷积噪声可以通过同态变换而转化为加性噪声。在环境声检测中,非平稳的背景噪声是影响其检测准确率的重要因素,由于不同地区的背景噪声是不同的,若要在特定地区的创建一个环境声数据库是不现实的,因而我们只能通过对声音数据库添加噪声来尽可能的模拟现实生活中的声音来达到对算法的分析以及实际场景的监测应用,本博客主要包括声音信号的噪声叠加以及程序验证两个方面。

噪声程序的叠加

噪声的叠加依据信噪比公式(Signal noise ratio formula): S N R = 10   l g S N SNR = 10\ lg \frac{S}{N} SNR=10 lgNS​ S S S-声音信号的平均能量; N N N-噪声信号的平均能量。

声音信号叠加指定信噪比的高斯白噪声 function [y,noise] = Gnoisegen(x,snr) % 该函数针对单声道声音信号,若有需求请自行更改 % 程序手打,若有错误请联系我. % 本程序来源于宋知用老师的《MATLAB语音信号分析与合成》书中,在此引用表示感谢。 %x-声音信号;snr-信噪比数值(dB) noise = randn(size(x));%用randn产生高斯白噪声 ns = length(x);%求出信号的长度 signal_power = 1/ns*sum(x.*x);%计算信号的平均能量 noise_power = 1/ns*sum(noise.*noise);%计算噪声的平均能量 noise_variance = signal_power/(10^(snr/10));%计算噪声设定的方差值 noise = sqrt(noise_variance/noise_power)*noise;%按噪声的平均能量构成相应的白噪声 y = x+noise end 将噪声数据文件的数据叠加生成任意信噪比的带噪声音信号 function [Y,NOISE] = add_noisefile(X,filepath_name,SNR,fs) % add_noisefile add determinated noise to a signal. % X is signal, and its sample frequency is fs; % filepath_name is NOISE's path and name, and the SNR is signal to noise ratio in dB. [wavin,fs1]=audioread(filepath_name); if size(wavin,2)==2 % turn double channel to single channel wavin=wavin(:,1); end if fs1~=fs wavin=resample(wavin,fs,fs1);%调整噪声数据采样频率使其与声音信号保持一致(在此建议不要用resample做采样频率的更改) end nx=size(X,1); % 从噪声源随机抽取一段噪声,将其叠加到目标声音中 start_time=unidrnd(length(wavin)-nx); NOISE=wavin(start_time:start_time+nx-1); NOISE=NOISE-mean(NOISE); %去直流 signal_power = 1/nx*sum(X.*X); %求出信号的平均能量 noise_power = 1/nx*sum(NOISE.*NOISE); %求出噪声的平均能量 noise_variance = signal_power / ( 10^(SNR/10) ); NOISE=sqrt(noise_variance/noise_power)*NOISE; Y=X+NOISE; end 程序测试

老师告诉我们,程序在使用之前首先要经过测试,这样才能保证所做实验的正确性和可靠性。

扫频信号叠加高斯白噪声

下图是实验流程 图1 高斯白噪声验证实验 首先来看一下加噪前后的时域波形对比图。 扫频信号加噪前后时域波形对比图最上面那个图是用matlab产生的0-20KHz的线性扫频信号时域波形,中间图是指0dB的高斯白噪声时域波形图,最下面图是指叠加0dB高斯白噪声后的扫频信号时域波形图。通过分析三种信号的平均能量可以看出添加0dB的高斯白噪声的噪声信号的平均能量与扫频声信号的平均能量相等,该结果符合信噪比公式。 接下来看一下加噪前后的频谱对比图。(TIp:上面chirp信号的0.4-0.5s 0.7-0.8s出现了一个缺口,是因为采样频率低的原因,一般采样频率要高于信号最高频率的4-5倍才可以) 扫频信号加噪前后频谱对比图观察其频谱,可以直观的看到第三张图是第一张图与第二张图的合成,这符合噪声信号的叠加效果。

实际玻璃破碎声叠加实地采集到的背景噪声

再来看一下玻璃破碎声与叠加实际采到的真实噪音数据,下图是实验流程。 程序测试流程首先看一下加噪前后时域波形对比图,同样从平均能量来分析。 加噪前后时域波形对比图分析同上个小实验,从平均能量来说,叠加odB背景噪声后,玻璃破碎声与背景噪声的平均能量相同,且二者加和与加噪后声音平均能量大致相等。 接下来看一下加噪前后频谱对比图。 加噪前后频谱波形对比图通过仔细观察其频谱波形,能够看出第三张图是第一张图与第二张图叠加而成,这同样验证了程序的正确性。

总结

对程序加噪来验证算法的合理性仅仅是在理论仿真的角度来说,若要在真实场景应用还需要实地采集声音对分类或者识别算法进行验证。本博客原创,转载请注明出处,若有纰漏请批评指出,谢谢。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3