【转帖】Matlab信号上叠加噪声和信噪比的计算

Matlab信号上叠加噪声和信噪比的计算

发表于11个月前(2014-01-24 18:38)      阅读(26) | 评论(0

0人收藏此文章,
我要收藏

0

开源中国 Team 团队协作平台正式开放 —— http://team.oschina.net

信噪比

在信号处理中经常需要把噪声叠加到信号上去,在叠加噪声时往往需要满足一定的信噪比,这样产生二个问题,其一噪声是否按指定的信噪比叠加,其二怎么样检验带噪信号中信噪比满足指定的信噪比。 在MATLAB中可以用randn产生均值为0方差为1的正态分布白噪声,但在任意长度下x=randn(1,N),x不一定是均值为0方差为1(有些小小的偏差),这样对后续的计算会产生影响。在这里提供3个函数用于按一定的信噪比把噪声叠加到信号上去,同时可检验带噪信号中信噪比。 1,把白噪声叠加到信号上去:

?


1

2

3

4

5

6

7

8

9

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,其中带有白噪声、办公室噪声、工厂噪声、汽车噪声、坦克噪声等等,在信号处理中往往需要把库中的噪声叠加到信号中去,而噪声的采样频率与纯信号的采样频率往往不一致,需要采样频率的校准。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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

?


1

2

3

4

5

6

7

8

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是信噪比 以下给出调用上函数的例子可作参考: 例一

?


1

2

3

4

5

6

7

8

9

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)

例二

?


1

2

3

4

5

6

7

8

9

10

11

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)

参考: [1] .  http://www.ilovematlab.cn/thread-54155-1-1.html

时间: 2024-07-30 13:40:21

【转帖】Matlab信号上叠加噪声和信噪比的计算的相关文章

《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) <量化投资:以MATLAB为工具>简介 <量化投资:以MATLAB为工具>是由电子工业出版社(PHEI)下属旗舰级子公司——北京博文视点资讯有限公司出版的<量化投资与对冲基金丛书>之一,丛书主编为丁鹏博士,<量化投资:以MATLAB为工具>由李洋(faruto)

数学图形(2.11) 帖在球上的曲线图形

前面发布了很多种二维的曲线图形,其实所有的二维图形再加一个维度值就可以变成三维图形.那么这一节的内容是将一个二维曲线帖到一个球面上,以生成三维曲线. 帖到球上的方式是以如下公式生成第三个维度的数值: y = sqrt(a*a - x*x - z*z) 这里举个例子是之前发的一种二维曲线: 数学图形(1.27) 花 Cyclic-harmonic_sphere vertices = 12000 t = from 0 to (40*PI) a = 10 e = 1 n = rand2(0.1, 10

高斯白噪声叠加到信号上

一.概念    英文名称:white Gaussian noise; WGN    定义:均匀分布于给定频带上的高斯噪声:    所谓高斯白噪声中的高斯是指概率分布是正态函数,而白噪声是指它的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性.这是考察一个信号的两个不同方面的问题.    高斯白噪声:如果一个噪声,它的幅度服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声.    热噪声和散粒噪声是高斯白噪声.二.matlab举例    Matlab有两个函数可以产生高斯白噪

MATLAB信号与系统分析(五)&mdash;&mdash;连续时间信号的频谱分析

一.实验目的: 1.掌握傅立叶级数(FS),学会分析连续时间周期信号的频谱分析及MATLAB实现: 2.掌握傅立叶变换(FT),了解傅立叶变换的性质以及MATLAB实现. 二.利用符号运算求傅里叶级数的系数 1.复习几个函数: F1=int(f,v,a,b) - 对f表达式的v变量在(a,b)区间求定积分 F2=subs(s,OLD,NEW)-用新变量NEW代替S中的指定变量OLD. F3=vpa(x,n) : 显示可变精度计算:x为符号变量,n表示要精确计算的位数. 2.周期函数的傅里叶级数的

MATLAB信号与系统分析(四)&mdash;&mdash;离散信号与系统的复频域分析及MATLAB实现

一.系统的z变换和反变换 1.利用部分分式展开求解逆Z变换: 2.例子 3.Z变换的MATLAB函数 clear all f=sym('cos(a*k)'); F=ztrans(f) F=sym('z^2/((1+z)*(z-2))'); f=iztrans(F) 二.系统的零极点分布及其稳定性 %求H(z)=(z^3+2z)/(z^4+3(z^3)+2(z^2)+2z+1)的零极点及其分布图 %求H(z)=(1+z^(-1))/(1+z^-1/2+z^-2/4+1)的零极点及其分布图 %采用r

MATLAB信号与系统分析(二)&mdash;&mdash;离散时间信号与系统的时域分析

一.离散信号的表示 1.一个离散信号需要用两个向量来表示: (1)离散信号的幅值 (2)离散信号的位置信息 2.用MATLAB实现离散信号的可视化 (1)不能利用符号运算来表示 (2)绘制离散信号一般采用stem命令. (3)x(n)--stem(n,x) 3.一个demo: clear all; x=[-1,2,3,3,5,-4]; n=[-2,-1,0,1,2,3]; figure(1) stem(n,x),axis([-2.5,3.5,-4.5,5.5]) 二.一些常用的离散信号 1.单位

MATLAB信号与系统分析(一)&mdash;&mdash;连续时间信号与系统的时域分析

一.连续时间信号的表示: 1.向量表示法: 在MATLAB中,是用连续信号在等时间间隔点的样值来近似表示连续信号,当取样时间间隔足够小时,这些离散的样值就能较好地近似出连续信号. 对于连续时间信号f(t),一般是用两个行向量f和t来表示.t=t1:p:t2 ,t1 表示的是信号的起始时间,t2为终止时间,p为时间的间隔.而f为连续时间f(t)在向量t所定义的时间范围内对应的样值. 2.符号运算表示法: 使用sym定义变量,然后进行表示. Eg:分别采用上述两种方法画出抽样信号: clear al

矩阵乘法在numpy/matlab/数学上的不同

数学意义上的矩阵乘法 注意事项: 1.当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘. 2.矩阵C的行数等于矩阵A的行数,C的列数等于B的列数. 3.乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和. 乘积-哈达马积(hadamard product) 乘积-克罗内克乘积 MatLab中的乘法()和点乘(.) a * b 是进行矩阵相乘, a.*b是a矩阵的每一个元素乘以b矩阵对应位置的元素 形成的一个新矩阵. Numpy In [1

Matlab 信号与系统课设 - BiRadio仿真电台

BiRadio Author : Benjamin142857 Date : 2018-12 Video : BiliBili Github : BiAudio 1. 使用介绍 [1]三个播音电台选择好音频文件,若未选择则播放与暂停按钮无法按下,以防程序报错.同时使用了异常处理,当用户打开文件选择目录,未选择文件直接退出时,不影响程序运作,保证了交互的严谨性. [2]当三个音频文件都顺利加载完成时,播放与暂停按键恢复可用,此时可开始播放,线程4会对三个电台的音频分段时序性地进行调制,将其单边频谱