Matlab信号添加噪声及信噪比SNR的计算

一、MATLAB中自带的高斯白噪声的两个函数

MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN。WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。

1. WGN:产生高斯白噪声
y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度。
y = wgn(m,n,p,imp) 以欧姆(Ohm)为单位指定负载阻抗。
y = wgn(m,n,p,imp,state) 重置RANDN的状态。

在数值变量后还可附加一些标志性参数:
y = wgn(…,POWERTYPE) 指定p的单位。POWERTYPE可以是'dBW', 'dBm'或'linear'。线性强度(linear power)以瓦特(Watt)为单位。
y = wgn(…,OUTPUTTYPE) 指定输出类型。OUTPUTTYPE可以是'real'或'complex'。
2. AWGN:在某一信号中加入高斯白噪声
y = awgn(x,SNR) 在信号x中加入高斯白噪声。信噪比SNR以dB为单位。x的强度假定为0dBW。如果x是复数,就加入复噪声。
y = awgn(x,SNR,SIGPOWER) 如果SIGPOWER是数值,则其代表以dBW为单位的信号强度;如果SIGPOWER为'measured',则函数将在加入噪声之前测定信号强度。
y = awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的状态。
y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的单位。POWERTYPE可以是'dB'或'linear'。如果POWERTYPE是'dB',那么SNR以dB为单位,而SIGPOWER以dBW为单位。如果POWERTYPE是'linear',那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。

二、通过相关概念自编函数实现任意噪声的叠加及信噪比的计算

       在信号处理中经常需要把噪声叠加到信号上去,在叠加噪声时往往需要满足一定的信噪比,这样产生二个问题,其一噪声是否按指定的信噪比叠加,其二怎么样检验带噪信号中信噪比满足指定的信噪比。
在MATLAB中可以用randn产生均值为0方差为1的正态分布白噪声,但在任意长度下x=randn(1,N),x不一定是均值为0方差为1(有些小小的偏差),这样对后续的计算会产生影响。在这里提供3个函数用于按一定的信噪比把噪声叠加到信号上去,同时可检验带噪信号中信噪比。
1,把白噪声叠加到信号上去:
function [Y,NOISE] = noisegen(X,SNR)
% noisegen add white Gaussian noise to a signal.
% [Y, NOISE] = NOISEGEN(X,SNR) adds white Gaussian NOISE to X.  The SNR is in dB.
NOISE=randn(size(X));
NOISE=NOISE-mean(NOISE);
signal_power = 1/length(X)*sum(X.*X);
noise_variance = signal_power / ( 10^(SNR/10) );
NOISE=sqrt(noise_variance)/std(NOISE)*NOISE;
Y=X+NOISE;
其中X是纯信号,SNR是要求的信噪比,Y是带噪信号,NOISE是叠加在信号上的噪声。

2,把指定的噪声叠加到信号上去
有标准噪声库NOISEX-92,其中带有白噪声、办公室噪声、工厂噪声、汽车噪声、坦克噪声等等,在信号处理中往往需要把库中的噪声叠加到信号中去,而噪声的采样频率与纯信号的采样频率往往不一致,需要采样频率的校准。
function [Y,NOISE] = add_noisem(X,filepath_name,SNR,fs)
% add_noisem 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,nbits]=wavread(filepath_name);
if fs1~=fs
    wavin1=resample(wavin,fs,fs1);
end
nx=size(X,1);
NOISE=wavin1(1:nx);
NOISE=NOISE-mean(NOISE);
signal_power = 1/nx*sum(X.*X);
noise_variance = signal_power / ( 10^(SNR/10) );
NOISE=sqrt(noise_variance)/std(NOISE)*NOISE;
Y=X+NOISE;
其中X是纯信号,filepath_name是指定噪声文件(.wav)的路径和文件名,SNR是要求的信噪比,fs是信号X的采样频率,Y是带噪信号,NOISE是叠加在信号上的噪声。

3,检验带噪信号的信噪比
信噪比的定义为
           信号能量              (纯信号)^2
SNR=-----------------=--------------------------
           噪声能量        (带噪信号-纯信号)^2

function snr=SNR_singlech(I,In)
% 计算信噪比函数
% I :original signal
% In:noisy signal(ie. original signal + noise signal)
snr=0;
Ps=sum(sum((I-mean(mean(I))).^2));%signal power
Pn=sum(sum((I-In).^2));           %noise power
snr=10*log10(Ps/Pn);
其中I是纯信号,In是带噪信号,snr是信噪比

以下给出调用上函数的例子可作参考:
例一
clear all; clc; close all;
[filename,pathname]=uigetfile('*.wav','请选择语音文件:');
[X,fs]=wavread([pathname filename]);
[Y,NOISE] = noisegen(X,10);
subplot 311; plot(X);
subplot 312; plot(NOISE);
subplot 313; plot(Y);
mn=mean(NOISE)
snr=SNR_singlech(X,Y)

例二
clear all; clc; close all;
[filename,pathname]=uigetfile('*.wav','请选择语音文件:');
[filename1,pathname1]=uigetfile('*.wav','请选择噪声文件:');
filepath_name=[pathname1 filename1];
[X,fs]=wavread([pathname filename]);
[Y,NOISE] = add_noisem(X,filepath_name,10,fs);
subplot 311; plot(X);
subplot 312; plot(NOISE);
subplot 313; plot(Y);
mn=mean(NOISE)
snr=SNR_singlech(X,Y)
  • 45
    点赞
  • 437
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: 在matlab噪声信号SNR信噪比波形,可以通过以下步骤实现: 1. 计算信号的能量:假设信号存储在向量x信号的能量可以通过以下公式计算: E_signal = sum(abs(x).^2) 2. 计算噪声的能量:假设噪声存储在向量n噪声的能量可以通过以下公式计算: E_noise = sum(abs(n).^2) 3. 计算信噪比信噪比可以通过以下公式计算SNR = 10*log10(E_signal/E_noise) 4. 绘制信噪比波形:假设信号在每个时间点的噪声信噪比存储在向量SNR_time,可以使用matlab的plot函数绘制信噪比随时间变化的波形: plot(SNR_time) 以上是求噪声信号SNR信噪比波形的基本步骤,需要注意的是,我们可以在不同的时间点计算信号噪声的能量,以获得信噪比随时间变化的波形。此外,这个过程需要先测量信号的含噪比(SNR)才能完成,所以通常需要提前评估信号含噪比的准确度。 ### 回答2: SNR信噪比的英文缩写,它是用来衡量一个信号噪声信号的影响程度的一个常用指标。在对信号进行处理时,人们需要了解信号噪声的大小及其比例,以此了解信号的质量,同时也可以对噪声进行相应的处理。MATLAB是一个常用的计算机编程软件,在信号处理也有着非常重要的作用。 下面我们以MATLAB代码求噪声信号SNR信噪比波形的过程为例来说明。 首先,为了方便进行计算,我们需要定义一些变量,比如噪声的功率、信号的功率、信号噪声的功率和等。其次,我们需要采用一种信号处理技术来计算SNR,最常用的就是傅里叶变换和功率谱法。 其,傅里叶变换方法可以将信号从时域变换到频域,并且可以很容易地求得信号的功率谱密度。利用信号的功率谱和噪声的功率谱可以方便地求出信噪比。 功率谱法则是采用功率谱密度方法进行计算,同样可以得到信噪比。但需要注意的是,信号的功率谱密度和噪声的功率谱密度需要在同一频段内进行比较。 对于具体的代码实现过程,我们可以先生成一个包含噪声信号,如下: x = 0:0.001:1; y = sin(2*pi*100*x) + 0.1*randn(size(x)); 其,x是时间序列,y是信号,randn是MATLAB内置的产生高斯白噪声的函数,randn(size(x))则表示生成一个与x相同长度的噪声信号。 然后,我们可以对信号进行傅里叶变换,然后求出信号的功率谱密度和噪声的功率谱密度,然后计算SNR。具体的代码如下: Y = fft(y); Pyy = Y.* conj(Y) / length(y); SNR = mean(Pyy(1:10))/mean(Pyy(11:end)); 其,Y是傅里叶变换后的信号,Pyy是信号的功率谱密度,mean(Pyy(1:10))表示前10个频率点的平均功率谱,mean(Pyy(11:end))表示从第11个频率点到最后一个频率点的平均功率谱,SNR则是信噪比。 最后,我们可以利用MATLAB内置的plot函数将结果可视化。完整的代码如下: x = 0:0.001:1; y = sin(2*pi*100*x) + 0.1*randn(size(x)); Y = fft(y); Pyy = Y.* conj(Y) / length(y); SNR = mean(Pyy(1:10))/mean(Pyy(11:end)); figure; subplot(2,1,1); plot(x,y); xlabel('时间'); ylabel('振幅'); title('含噪声信号'); subplot(2,1,2); plot(x,Pyy); xlabel('频率'); ylabel('功率谱密度'); title(['信噪比 = ',num2str(SNR),' dB']); 这样就可以得到噪声信号SNR信噪比波形。通过不断调节噪声信号的大小和比例,可以验证该方法的有效性和可靠性。 ### 回答3: MATLAB是广泛应用于工程和科学领域的软件平台,包含许多工具箱和函数,其包括信号处理和噪声分析。通过编写Matlab代码,我们可以计算噪声信号信噪比(SNR)和绘制SNR波形。 首先,我们需要准备一个含有噪声信号的数据向量或矩阵。接下来,我们可以使用Matlab的函数来计算SNR值。其信号的能量可以通过幅度平方和计算噪声的能量可以通过信号噪声之间的差平方和计算。因此,SNR计算公式可以写成: SNR = 10 × log10(能量信号 / 能量噪声) 我们可以通过使用Matlab的rms和var函数来计算信号噪声分别的rms和方差。具体代码如下: x = input('噪声信号数据:'); % 输入噪声信号 SNR = 10 * log10(rms(x)^2 / var(x)); 以上代码可以计算噪声信号SNR值。为了绘制SNR波形,我们需要对噪声信号进行处理,并计算不同时间段的SNR值,并将其用图表或图形呈现出来。 例如,我们可以使用Matlab的movmean函数来计算移动平均SNR值,然后使用plot函数来绘制SNR波形。代码如下: x = input('噪声信号数据:'); % 输入噪声信号 N = input('移动平均窗口大小:'); % 设置移动平均窗口大小 for i = 1:length(x)-N SNR(i) = 10*log10(rms(x(i:i+N-1))^2 / var(x(i:i+N-1))); % 计算当前窗口SNR值 end plot(SNR); % 绘制SNR波形 以上代码可以计算噪声信号SNR波形,并提供了一种可视化表示方法,以便更好地分析和理解噪声信号的特性。通过Matlab代码的编写,我们可以更加深入地研究噪声信号,为工程和科学领域提供更加精确和可靠的数据分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值