色噪声的产生及MATLAB实现

色噪声

色噪声是指功率谱不平坦的噪声,与之相对应的是白噪声,白噪声定义为在无限频率范围内功率谱密度为常数的信号。一种常见的色噪声产生方法就是利用白噪声通过滤波器,使其功率谱在对应的范围内不再保持常数。

ARMA(自回归滑动平均)模型

如果系数 a 1 , a 2 , ⋯   , a p {{a}_{1}},{{a}_{2}},\cdots ,{{a}_{p}} a1,a2,,ap b 1 , b 2 , ⋯   , b q {{b}_{1}},{{b}_{2}},\cdots ,{{b}_{q}} b1,b2,,bq不全为零,并且 a p ≠ 0 {{a}_{p}}\ne 0 ap=0 b q ≠ 0 {{b}_{q}}\ne 0 bq=0,那么此时系统既存在零点也存在极点。当序列 w ( n ) w\left( n \right) w(n)通过上述系统后,那么系统的输出 y ( n ) y\left( n \right) y(n)与输入 w ( n ) w\left( n \right) w(n)之间的关系可以用下列查分方程表示
y ( n ) = − a 1 y ( n − 1 ) − a 2 y ( n − 2 ) − ⋯ − a p y ( n − p )    + w ( n ) + b 1 w ( n − 1 ) + b 2 w ( n − 2 ) + ⋯ + b q w ( n − q ) = ∑ k = 0 q b k w ( n − k ) − ∑ k = 1 p a k y ( n − k ) \begin{aligned} & y\left( n \right)=-{{a}_{1}}y\left( n-1 \right)-{{a}_{2}}y\left( n-2 \right)-\cdots -{{a}_{p}}y\left( n-p \right) \\ & \ \ +w\left( n \right)+{{b}_{1}}w\left( n-1 \right)+{{b}_{2}}w\left( n-2 \right)+\cdots +{{b}_{q}}w\left( n-q \right) \\ & =\sum\limits_{k=0}^{q}{{{b}_{k}}w\left( n-k \right)}-\sum\limits_{k=1}^{p}{{{a}_{k}}y\left( n-k \right)} \end{aligned} y(n)=a1y(n1)a2y(n2)apy(np)  +w(n)+b1w(n1)+b2w(n2)++bqw(nq)=k=0qbkw(nk)k=1paky(nk)

系统输出功率谱密度函数

S y ( Ω ) = S w ( Ω ) ∣ ∑ k = 0 q b k e − j Ω k ∣ 2 ∣ ∑ k = 0 p a k e − j Ω k ∣ 2 {{S}_{y}}\left( \Omega \right)={{S}_{w}}\left( \Omega \right)\frac{{{\left| \sum\limits_{k=0}^{q}{{{b}_{k}}{{e}^{-j\Omega k}}} \right|}^{2}}}{{{\left| \sum\limits_{k=0}^{p}{{{a}_{k}}{{e}^{-j\Omega k}}} \right|}^{2}}} Sy(Ω)=Sw(Ω)k=0pakejΩk2k=0qbkejΩk2

系统输出自相关函数

R y ( m ) = R y ( n 1 − n 2 ) = E { y ( n 2 ) [ ∑ k = 0 q b k w ( n 1 − k ) − ∑ k = 1 p a k y ( n 1 − k ) ] } = ∑ k = 0 q b k R w y ( m − k ) − ∑ k = 1 p a k R y ( m − k ) \begin{aligned} & {{R}_{y}}\left( m \right)={{R}_{y}}\left( {{n}_{1}}-{{n}_{2}} \right)=E\left\{ y\left( {{n}_{2}} \right)\left[ \sum\limits_{k=0}^{q}{{{b}_{k}}w\left( {{n}_{1}}-k \right)-\sum\limits_{k=1}^{p}{{{a}_{k}}y\left( {{n}_{1}}-k \right)}} \right] \right\} \\ & =\sum\limits_{k=0}^{q}{{{b}_{k}}{{R}_{wy}}\left( m-k \right)-\sum\limits_{k=1}^{p}{{{a}_{k}}{{R}_{y}}\left( m-k \right)}} \end{aligned} Ry(m)=Ry(n1n2)=E{y(n2)[k=0qbkw(n1k)k=1paky(n1k)]}=k=0qbkRwy(mk)k=1pakRy(mk)
如果输入是白噪声序列的话,那么系统的输出的功率谱和自相关函数可以表示为
S y ( Ω ) = σ w 2 ∣ ∑ k = 0 q b k e − j Ω k ∣ 2 ∣ ∑ k = 0 p a k e − j Ω k ∣ 2 {{S}_{y}}\left( \Omega \right)=\sigma _{w}^{2}\frac{{{\left| \sum\limits_{k=0}^{q}{{{b}_{k}}{{e}^{-j\Omega k}}} \right|}^{2}}}{{{\left| \sum\limits_{k=0}^{p}{{{a}_{k}}{{e}^{-j\Omega k}}} \right|}^{2}}} Sy(Ω)=σw2k=0pakejΩk2k=0qbkejΩk2
R y ( m ) = R y ( n 1 − n 2 ) = E { y ( n 2 ) [ ∑ k = 0 q b k w ( n 1 − k ) − ∑ k = 1 p a k y ( n 1 − k ) ] } = ∑ k = 0 q b k R w y ( m − k ) − ∑ k = 1 p a k R y ( m − k ) = ∑ k = 0 q b k σ w 2 h ( m − k ) − ∑ k = 1 p a k R y ( m − k ) \begin{aligned} & {{R}_{y}}\left( m \right)={{R}_{y}}\left( {{n}_{1}}-{{n}_{2}} \right)=E\left\{ y\left( {{n}_{2}} \right)\left[ \sum\limits_{k=0}^{q}{{{b}_{k}}w\left( {{n}_{1}}-k \right)-\sum\limits_{k=1}^{p}{{{a}_{k}}y\left( {{n}_{1}}-k \right)}} \right] \right\} \\ & =\sum\limits_{k=0}^{q}{{{b}_{k}}{{R}_{wy}}\left( m-k \right)-\sum\limits_{k=1}^{p}{{{a}_{k}}{{R}_{y}}\left( m-k \right)}} \\ & \text{=}\sum\limits_{k=0}^{q}{{{b}_{k}}\sigma _{w}^{2}h\left( m-k \right)-\sum\limits_{k=1}^{p}{{{a}_{k}}{{R}_{y}}\left( m-k \right)}} \end{aligned} Ry(m)=Ry(n1n2)=E{y(n2)[k=0qbkw(n1k)k=1paky(n1k)]}=k=0qbkRwy(mk)k=1pakRy(mk)=k=0qbkσw2h(mk)k=1pakRy(mk)
其中 h ( n ) h\left( n \right) h(n)为系统的冲激响应,其表达式为
h ( n ) = { − ∑ k = 1 p a k h ( n − k ) + b n ,         0 ≤ n ≤ q − ∑ k = 1 p a k h ( n − k ) ,                  n > q             0 ,                           n < 0 h\left( n \right)=\left\{ \begin{aligned} & -\sum\limits_{k=1}^{p}{{{a}_{k}}h\left( n-k \right)}+{{b}_{n}},\ \ \ \ \ \ \ 0\le n\le q \\ & -\sum\limits_{k=1}^{p}{{{a}_{k}}h\left( n-k \right),\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ n>q} \\ & \ \ \ \ \ \ \ \ \ \ \ 0,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ n<0 \\ \end{aligned} \right. h(n)=k=1pakh(nk)+bn,       0nqk=1pakh(nk),                n>q           0,                         n<0

AR模型

当系数 b 1 , b 2 , ⋯   , b q {{b}_{1}},{{b}_{2}},\cdots ,{{b}_{q}} b1,b2,,bq 为0且 a p ≠ 0 {{a}_{p}}\ne 0 ap=0 时,系统为全极点系统,
系统的输出可以表示为
y ( n ) = w ( n ) − ∑ k = 1 p a k y ( n − k ) y\left( n \right)=w\left( n \right)-\sum\limits_{k=1}^{p}{{{a}_{k}}y\left( n-k \right)} y(n)=w(n)k=1paky(nk)
那么系统的传输函数和冲激响应可以表示为
H ( j Ω ) = 1 1 + ∑ k = 1 p a k e − j Ω k = 1 ∑ k = 0 p a k e − j Ω k H\left( j\Omega \right)=\frac{1}{1+\sum\limits_{k=1}^{p}{{{a}_{k}}{{e}^{-j\Omega k}}}}=\frac{1}{\sum\limits_{k=0}^{p}{{{a}_{k}}{{e}^{-j\Omega k}}}} H(jΩ)=1+k=1pakejΩk1=k=0pakejΩk1
h ( n ) = { − ∑ k = 1 p a k h ( n − k ) + δ ( n ) ,      n ≥ 0 0 ,                                    n < 0 h\left( n \right)=\left\{ \begin{aligned} & -\sum\limits_{k=1}^{p}{{{a}_{k}}h\left( n-k \right)+\delta \left( n \right),\ \ \ \ n\ge 0} \\ & 0,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ n<0 \\ \end{aligned} \right. h(n)=k=1pakh(nk)+δ(n),    n00,                                  n<0
由上面的表达式可以看出,AR(p)模型是AR(p,q)模型经过q=0退化来的,那么系统输出的功率谱密度函数和自相关函数可以表示为
S y ( Ω ) = σ w 2 ∣ ∑ k = 0 p a k e − j Ω k ∣ 2 {{S}_{y}}\left( \Omega \right)=\frac{\sigma _{w}^{2}}{{{\left| \sum\limits_{k=0}^{p}{{{a}_{k}}{{e}^{-j\Omega k}}} \right|}^{2}}} Sy(Ω)=k=0pakejΩk2σw2

R y ( m ) = R y ( n 1 − n 2 ) = E { y ( n 2 ) [ w ( n 1 ) − ∑ k = 1 p a k y ( n 1 − k ) ] } = R w y ( m ) − ∑ k = 1 p a k R y ( m − k ) = σ w 2 h ( − m ) − ∑ k = 1 p a k R y ( m − k ) \begin{aligned} & {{R}_{y}}\left( m \right)={{R}_{y}}\left( {{n}_{1}}-{{n}_{2}} \right)=E\left\{ y\left( {{n}_{2}} \right)\left[ w\left( {{n}_{1}} \right)-\sum\limits_{k=1}^{p}{{{a}_{k}}y\left( {{n}_{1}}-k \right)} \right] \right\} \\ & ={{R}_{wy}}\left( m \right)-\sum\limits_{k=1}^{p}{{{a}_{k}}{{R}_{y}}\left( m-k \right)} \\ & =\sigma _{w}^{2}h\left( -m \right)-\sum\limits_{k=1}^{p}{{{a}_{k}}{{R}_{y}}\left( m-k \right)} \end{aligned} Ry(m)=Ry(n1n2)=E{y(n2)[w(n1)k=1paky(n1k)]}=Rwy(m)k=1pakRy(mk)=σw2h(m)k=1pakRy(mk)

同理,将 a 1 = a 2 = ⋯ = a p = 0 {{a}_{1}}={{a}_{2}}=\cdots ={{a}_{p}}=0 a1=a2==ap=0时,此时为MA(p)模型,分析方法与上述类似,这里不再叙述。

利用MATLAB实现ARMA滤波

MATLAB中有filter函数,其功能是进行一维数字滤波

filter: One-dimensional digital filter. Y = filter(B,A,X) filters the data in vector X with the filter described by vectors A and B to create the filtered data Y. The filter is a “Direct Form II Transposed” implementation of the standard difference equation:

a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
                      - a(2)*y(n-1) - ... - a(na+1)*y(n-na)

If a(1) is not equal to 1, filter normalizes the filter
coefficients by a(1). 

filter always operates along the first non-singleton dimension,
namely dimension 1 for column vectors and non-trivial matrices,
and dimension 2 for row vectors.

[Y,Zf] = filter(B,A,X,Zi) gives access to initial and final
conditions, Zi and Zf, of the delays.  Zi is a vector of length
MAX(LENGTH(A),LENGTH(B))-1, or an array with the leading dimension 
of size MAX(LENGTH(A),LENGTH(B))-1 and with remaining dimensions 
matching those of X.

filter(B,A,X,[],DIM) or filter(B,A,X,Zi,DIM) operates along the
dimension DIM.

Tip:  If you have the Signal Processing Toolbox, you can design a
filter, D, using DESIGNFILT.  Then you can use Y = filter(D,X) to
filter your data.

上述是MATLAB中关于filter函数的介绍,可以看出其利用的ARMA模型进行滤波,因此可以将白噪声进行滤波获得色噪声,当然也可以利用其它滤波器进行滤波得到色噪声。
下面给出一个产生色噪声的小例子,样本数为1000。
在这里插入图片描述
在这里插入图片描述

将白噪声的一些特性画出来可以得到上述的结果。
设计一个低通滤波器(也可以直接指定系数,利用filter函数直接进行滤波),其中滤波器的幅频特性如下:
在这里插入图片描述
白噪声经过滤波器后,可以得到色噪声,其结果如下:
在这里插入图片描述
在这里插入图片描述
可以看出,经过低通滤波后的白噪声的频谱或者是功率谱均不再保持平坦的特性,也就是得到了色噪声。
由于仿真时样本数较少,只能大概看出白噪声的功率谱基本是不变的,如果想得到更好的效果可以增加样本数,这里就不再叙述。

代码如下:

clear;
close all;
clc;
%产生高斯白噪声
N = 1e3;
t=0:(N-1);
w=randn(1,N);
mean_w=mean(w);                      %均值
var_w=var(w);                               %方差
[corr_w,lag]=xcorr(w,'unbiased');   %自相关函数
msv_w = var_w + mean_w.^2;     %均方值
[f1,x_w] = ksdensity(w);               %概率密度
f=0:N-1;
W=fft(w);
fft_w=abs(W);                               %频谱
power_w=W.*conj(W)/1024;          %功率谱密度
figure(1);
subplot(2,2,1);plot(w);
title('高斯白噪声');axis([0 N -5 5]);
subplot(2,2,2);plot(t,mean_w*ones(size(t)));
title('高斯白噪声均值');axis([0 N -2 2]);
subplot(2,2,3);plot(t,var_w*ones(size(t)));
title('高斯白噪声方差');axis([0 N -2 2]);
subplot(2,2,4);plot(t,msv_w*ones(size(t)));
title('高斯白噪声均方值');axis([0 N -2 2]);
figure(2)
subplot(2,2,1);plot(lag,corr_w);
title('高斯白噪声自相关函数');axis([-N N -1 1]);
subplot(2,2,2);plot(x_w,f1);
title('概率密度');
subplot(2,2,3);plot(f,fft_w);
title('高斯白噪声频谱');axis([0 N 0 80]);
subplot(2,2,4);plot(f,power_w);
title('高斯白噪声功率谱密度');axis([0 1024 0 8]);
%低通滤波器
Wp=2*pi*30;Ws=2*pi*40;Rp=0.5;Rs=40;fs=100;W=2*pi*fs;
[N1,Wn]=buttord(2*Wp/W,2*Ws/W,Rp,Rs);
[b,a]=butter(N1,Wn);
[h,f]=freqz(b,a,1000,fs);
figure(3);plot(f,abs(h)); xlabel('f/Hz');ylabel('|H(jf)|');
axis([0 100 0 1.2]);grid on;
title('低通滤波器幅频响应');
%生成高斯色噪声
y=filter(b,a,w);        %滤波产生高斯色噪声
mean_y=mean(y);     %均值
var_y=var(y);               %方差
[corr_y,lag]=xcorr(y,'unbiased');       %自相关函数
msv_y = var_y + mean_y.^2;     %均方值
[f1,x_y]=ksdensity(y);              %概率密度
f=0:N-1;
Y=fft(y);
fft_y=abs(Y);                       %频谱
power_y=Y.*conj(Y)/N;       %功率谱密度
figure(4);
subplot(2,2,1);plot(t,y);
title('高斯色噪声');axis([0 1024 -5 5]);
subplot(2,2,2);plot(t,mean_y*ones(size(t)));
title('高斯色噪声均值');axis([0 N -1 1]);
subplot(2,2,3);plot(t,var_y*ones(size(t)));
title('高斯色噪声方差');axis([0 N -0.5 1.5]);
subplot(2,2,4);plot(t,msv_y*ones(size(t)));
title('高斯色噪声均方值');axis([0 N -0.5 1.5]);
figure(5)
subplot(2,2,1);plot(lag,corr_y);
title('高斯色噪声自相关函数');axis([-N N -0.5 1]);
subplot(2,2,2);plot(x_y,f1);
title('高斯色噪声概率密度');
subplot(2,2,3);plot(f,fft_y);
title('高斯色噪声频谱');axis([0 N 0 100]);
subplot(2,2,4);plot(f,power_y);
title('高斯色噪声功率谱密度');axis([0 N 0 8]);

参考文献:
[1]叶中付. 统计信号处理 [M]. 中国科学技术大学出版社, 2013.

  • 18
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Matlab实现粉红噪声,可以使用提供的四个函数中的第一个函数。这个函数生成一个粉红(闪烁)噪声信号,其功率谱密度呈-3 dB/oct和-10 dB/dec的斜率。你可以使用以下代码来实现: ```matlab function pinkNoise = generatePinkNoise(numSamples, sampleRate) % 生成粉红噪声信号 pinkNoise = randn(numSamples, 1); pinkNoise = filter(1, [1, -0.5], pinkNoise); pinkNoise = filter([1, -0.5], 1, pinkNoise); pinkNoise = pinkNoise / max(abs(pinkNoise)); end ``` 在这个函数中,我们首先生成一个随机的高斯白噪声信号,然后通过滤波器来改变其频谱特性以产生粉红噪声。最后,我们将信号归一化以使其振幅范围在-1到1之间。 你可以调用这个函数来生成指定长度和采样率的粉红噪声信号。例如,要生成长度为10000的粉红噪声信号,采样率为44100Hz,可以使用以下代码: ```matlab numSamples = 10000; sampleRate = 44100; pinkNoise = generatePinkNoise(numSamples, sampleRate); ``` 这样就可以得到一个长度为10000的粉红噪声信号。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用 Matlab 生成粉红、红、蓝和紫噪声:通过白噪声的光谱处理生成粉红、红、蓝和紫噪声。...](https://download.csdn.net/download/weixin_38747946/19195953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [粉红噪声matlab产生](https://blog.csdn.net/xinshuwei/article/details/107914856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值