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

在信号处理中经常需要把噪声叠加到信号上去,在叠加噪声时往往需要满足一定的信噪比,这样产生二个问题,其一噪声是否按指定的信噪比叠加,其二怎么样检验带噪信号中信噪比满足指定的信噪比。

在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)

matlab-如何计算信噪比相关推荐

  1. matlab如何写程序算信噪比,Matlab中如何计算信噪比?

    %Matlab计算信噪比,程序如下 function snr=SNR(I,In) % 计算信号噪声比函数 % by Qulei % I :original signal % In:noisy sign ...

  2. matlab 信噪比,[转载]Matlab中如何计算信噪比?

    %Matlab计算信噪比,程序如下 function snr=SNR(I,In) % 计算信号噪声比函数 % by Qulei % I :original signal % In:noisy sign ...

  3. matlab 求解体积,matlab如何计算多面体体积

    一个多面体的体积应该如何计算? 这本来是一个比较复杂的问题,应该要用到积分,但在matlab中确实很简单的事情,因为有现成的函数,只要稍微组合一下就可以. 下面我把函数写成了被调用的格式,输入参数为多 ...

  4. 信噪比与错误指数matlab,关于信噪比不符合理论值的问题

    在求解信噪比时,加30db的高斯白噪声后所求得的信噪比不是30.而且理论上软阈值去噪效果应该是最好的,但是软阈值去噪后得到的信噪比却比其他方法要小,而且所有求得的信噪比数值都很小.我也在论坛里看到过类 ...

  5. matlab 计算指北角,用MATLAB如何计算出矩形区域内的最大值?

    在MATLAB图像处理工具箱(Image Processing Toolbox)的GUI函数中,有一些用来在图像或坐标轴上选择矩形或椭圆区域的函数,使用示例如下: 第一行代码:显示matlab内置的一 ...

  6. matlab如何计算矩阵的幂,MATLAB矩阵幂算法

    我想把一个算法从MATLAB移植到Python.所述算法的一个步骤涉及到取A^(-1/2),其中A是9x9平方复矩阵.据我所知,矩阵的平方根(及其逆矩阵的推广)不是唯一的.在 我一直在试验scipy. ...

  7. matlab 求信噪比

    clear all;clc;% 实信号求信噪比 % X= sqrt(2)*sin(0:pi/1000000:6*pi); %产生正弦信号 % Y = awgn(X,14,'measured'); %加 ...

  8. matlab 3维投影,matlab - 如何计算3维投影的面积? - 堆栈内存溢出

    第一步将使用convhull (如yar所建议 )来获取每个投影多边形区域的轮廓. 应该注意的是,这里要使用凸包,因为您要处理的是长方体,即长方体. 我认为您的第二个长方体(位于A(9:16, :) ...

  9. MATLAB如何计算函数导数

    这个是怎么回事?不懂! 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下M ...

  10. matlab如何计算出散点中各两个点之间的距离

    这里以30个点为例: num = [ 120.7015 36.3742 120.6987 36.3746 120.6998 36.3759 120.7069 36.3758 120.7056 36.3 ...

最新文章

  1. 10 年了,腾讯微信后台第一天提交的代码曝光 | 每日趣闻
  2. C#开发学习——web服务器端控件
  3. 在64位Windows 7 激活BitDefender Internet Security 2010
  4. 基于MATLAB的Okumura-Hata模型的仿真
  5. 5个拓展潜客的创意方法
  6. kernel panic 和 kernel Oops
  7. 数学思维比数学运算更重要
  8. 6 道 BATJ 必考的 Java 面试题
  9. 获取该字符串第N次出现的位置
  10. python编程入门课_程序设计入门—Python
  11. 【Elasticsearch】用Elasticsearch和Raspberry Pi构建一个真实世界的警报
  12. php require 输出乱码,php输出乱码
  13. 13岁的儿子早恋了,心思都不用在学习上,我要怎么帮助他?
  14. windows下php不支持mysql
  15. CMD-CMD命令之新建一个用户!
  16. 2022年全新UI聚合支付系统四方源码+修复BUG完美版
  17. cmd命令入门,简单教程dos
  18. MySQL 自联结 自连接
  19. 【Vue——basic】dom是什么
  20. Flutter 自定义组件实战之Cupertino(iOS)风格的复选框

热门文章

  1. Bert文本聚类实践
  2. 移动软交换技术在3G核心网中的实现
  3. 在线查看html文件大小,如何以HTML格式的可访问方式显示文件大小(How to display file sizes in an accessible way in HTML)...
  4. jQuery图片放大镜插件
  5. https在jsp中简单使用
  6. Simulink代码生成: Assignment模块及其代码
  7. python实现qq登录注册_python实现QQ批量登录功能
  8. 用TFTP 将生成的文件传输到开发板
  9. Windows10家庭版安装Microsoft Visual Studio 2010详细教程
  10. PM981/PM981a安装黑苹果(第七版)