声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5794|回复: 18

[综合讨论] 加速度信号中加10%的噪声

  [复制链接]
发表于 2010-11-6 01:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
上一个帖子问,怎么在Matlab中实现对桁架模型施加白噪声激励,得出加速度响应,然后对响应信号处理,得到结构模态参数。
感谢VibrationMaster提供的帮助。现在问题解决了。

现在又遇到个小问题,就是为了验证模态参数识别程序的有效性,打算在加速度响应信号里添加5%,10%,20%的噪声,看到文章上有人这样做的,我也想验证一下我的程序在噪声环境下是否能准确识别出参数。
现在就是不知道怎么样在已有响应信号中添加5%,10%,20%的噪声,请求一下各位。

感谢

回复
分享到:

使用道具 举报

发表于 2010-11-6 09:47 | 显示全部楼层
添加噪声好像有专门的函数吧!
网上搜索一下,或等待高人!
发表于 2010-11-6 10:30 | 显示全部楼层
help awgn?
个人以为那只是说明一种大小比较而已
ref: 关于信噪比与向已知信号添加噪声的整理及个人心得http://forum.vibunion.com/thread-31086-1-1.html
发表于 2010-11-6 20:06 | 显示全部楼层
1. 假定x(1),x(2),....,x(n)是计算得到的加速度.
2. 计算出它的方差 sigma
3. 用 sigma*sqrt(10%)*randn(1,n) 或 sigma*sqrt(10%)*randn(n,1)产生n个随机数
4.将n个随机数分别加到x(1),x(2),....,x(n)-->完成任务

评分

1

查看全部评分

 楼主| 发表于 2010-11-7 11:27 | 显示全部楼层
本帖最后由 secondye 于 2010-11-7 11:31 编辑

回复 4 # VibrationMaster 的帖子

再次感谢 VibrationMaster的解答。
刚刚试了一下,加噪声前后做FFT分析的结果都很好,峰值都很明显,按道理应该加噪声后的FFT结果不是那么好吧?
不知道代码跟方法有没有写错,贴上了再请教:
% gAcce是原始响应信号,gAcce_noise是添加噪声的响应信号
% Nodf 是响应通道数目,npts是数据点数目
for i=1:Ndof
    sigma=std(gAcce,0,1);                         %% 求每一列信号的均方差
    wn(:,i)=randn(npts,1);                         %% 产生均值为0,方差为1的高斯随机序列,也就是白噪声序列
    noise(:,i)=sigma(i)*sqrt(0.1)*wn(:,i);    %% 按照VibrationMaster的方法
    gAcce_noise(:,i)=gAcce(:,i)+noise(:,i);  %% 信号叠加
end

              原始信号做FFT            
   11.jpg
       加10%噪声的信号做FFT
22.jpg

发表于 2010-11-7 12:15 | 显示全部楼层
FFT本质相当于一种平均,它相当于达到强化周期信号的谱峰效果,而白噪声能量则是分布在所有的频率带上。--这也就是为什么谱看起来比时程曲线看起来更漂亮的原因,也是用的比较广的原因--信号/噪声分离的比较直观
发表于 2010-11-7 12:27 | 显示全部楼层
 楼主| 发表于 2010-11-7 13:45 | 显示全部楼层
回复 6 # VibrationMaster 的帖子

哦,正是,添加白噪声后的频谱图,明显看出底下的应该就是白噪声的能量分布吧?这在添加白噪声前的FFT图上是没有的。

我想问的是,一般的实际信号采集过程中,有环境噪声的影响,对信号进行分析时,一般会出现一些虚假的模态,对识别真实模态的精度造成影响。
我想模拟这个信号采集过程。比较无噪声和有噪声情况下,我的程序识别模态参数的精度。前面我做的添加白噪声的过程能不能当作是添加环境噪声?
如果是这样的一个过程,如您所说的,白噪声的能量分布在所有的频率带上,对FFT分析精度没有影响?那对时域法如ERA,SSI的识别精度呢?
发表于 2010-11-7 14:33 | 显示全部楼层
回复 7 # ChaChing 的帖子

噪声一般按能量计算,换算成幅度应开个平方
发表于 2010-11-7 14:37 | 显示全部楼层
回复 8 # secondye 的帖子

1。所有的估计算法都会受到噪声的影响,但是国内没有人做这个系统的比较。你感兴趣可以做个硕士毕业论文。
2。按照统计的观点,应该生成N组随机噪声,然后统计这N组的模态参数的均值和方差,用这组均值和方差来评估算法
3。上述的N应该大于1000
发表于 2010-11-7 15:13 | 显示全部楼层
回复 9 # VibrationMaster 的帖子

可能我误解了:@L
所谓的方差指的是variance(var)而不是standard deviation(std)!?
发表于 2010-11-7 15:18 | 显示全部楼层
VibrationMaster 发表于 2010-11-7 14:37
回复 8 # secondye 的帖子

1。所有的估计算法都会受到噪声的影响,但是国内没有人做这个系统的比较。你感兴 ...

所有的估计算法都会受到噪声的影响应该容易理解
但比较好奇的是, 国内没有人做过系统的比较!? 没教授有兴趣?
发表于 2010-11-7 15:59 | 显示全部楼层
确实是这样,国际上各人都说自己的方法好,但是系统地用噪声干扰来比较的文献我还没有读到,包括英文。
在发表论文界,这是吃力不讨好的活,尤其在振动界。我现在的主要方向不做这个了,想找个学生把所有的算法都读懂并实现,但是现在学生太懒,太ben,而且也没有这方面的基金支撑

点评

thanks  发表于 2010-11-7 16:29
 楼主| 发表于 2010-11-7 23:42 | 显示全部楼层
回复 13 # VibrationMaster 的帖子

哦,刚刚在Matlab中文论坛看到一个好帖,关于叠加噪声的,转过来了‘
原帖地址:http://www.ilovematlab.cn/thread-54155-1-1.html

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)

评分

1

查看全部评分

发表于 2010-11-8 00:23 | 显示全部楼层
回复 14 # secondye 的帖子

3F连接老八的帖子不是有吗!?:@)
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-1 13:23 , Processed in 0.094661 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表