数字信号处理matlab练习【1】
1.产生一个均匀分布的白噪声信号u(n),画出波形,并检验其分布
%使用rand函数产生均值为0.5,幅度在0-1之间的均匀分布的伪随机数
%以下将会调用rand函数产生一个均匀分布的白噪声信号
clear;
clc;
N=5000;%长序列u(n)的长度
u=rand(1,N);%产生N个均与分布的伪随机数u(n)
u_mean=mean(u)%求取u(n)的均值
u_power=var(u)%求取u(n)的方差
subplot(211);%两行一列第1个图
plot(u(1:100));%选取u(n)序列的前100个数据点
grid on;%显示方格
ylabel('u(n)');
xlabel('n')
title('1-100的u(n)数值显示')
%显示标题
subplot(212);%两行一列第2个图
hist(u,50);grid on;
%对u(n)作直方图,检验其分布。50是对u(n)的取值范围(0-1)所分解的细胞数
xlabel('u(n)');
ylabel('个数');
title('u(n)的直方图')
%显示标题
在上边的程序中我们可以看出,所求的白噪声
的长度特别大(N=5000),在实际中,我们可能不需要这么大,之所以取这么大是希望当u(n)序列足够长时更接近于白噪声接近于均匀分布。我们可以根据自己需要选取自己喜欢的任何一段即可。
其结果如下所示:
在上边的运行结果我们也可以得到该随机序列的均值(u_mean)和方差(u_power).
u_mean =
0.5005
u_power =
0.0836
我们可以看到,产生的u(n)的均值为0.5,方差为0.0836(1/12).
2.产生一均匀分布、均值为0、功率为0.01的白噪声信号
在上边的例子中我们使用rand函数产生的u(n)为均值为0.5,功率
,现在需要将均值变为0、功率变为
。实现前者比较容易,只需将u(n)减去均值即可,而实现后者则需要调整u(n)的幅度。根据已知,我们可以得到以下公式:
由于我们要实现的就是对于幅度的调整,来实现改变其方差,所以我们令以下等式成立
,其中常数
就是我们所要求的一个比例因子。
由上式的推导我们可以得出
,其中
的数值我们已知。
根据上边的推导,我们在matlab中敲下代码如下:
%%产生一个均匀分布、均值为0、功率为0.01的白噪声信号u(n)
clc;
clear;
N=50000;
%长序列u(n)的长度
p_1=0.083;
p_2=0.01;
%转换前的功率和所需要的功率
u=rand(1,N);
%产生5000个0-1的伪随机数
u=u-mean(u);
%此处实现将均值置为0
a=sqrt(12*p_2)
%求取常数比例因子
u1=u*a;
%对序列的幅度进行调整
u1_power=var(u1)
%求取该序列的方差
plot(u1(1:100));
%选取u(n)序列的前100个数据点
grid on;
%显示网格
xlabel('n')
ylabel('u1(n)')
title('1-100的u1(n)数值显示')
%坐标轴设置
运行之后,我们可以在输出行得到该序列的均值和功率以及需要求取的比例因子a:
a =
0.3464
u1_power =
0.0100
u1_mean =
-2.3466e-15
其运行结果如下所示:
通过上边的显示结果,我们可以看出,显然该序列的均值为0,幅度范围在-0.1733-0.1733之间。到此我们已经实现了我们的需求。
3.产生均值为0,方差为1,服从高斯(正态)分布的高斯白噪声 及其位移和尺度变换
在matlab中我们一般使用randn函数来产生该函数,其调用格式与rand格式相同,改变功率的方法也相同,只不过我们只需要将式子改为 即可。
%%产生均值为0,方差为1,服从高斯分布的白噪声信号u(n)
clc;
clear;
N=50000;
u=randn(1,N);
%产生50000个满足均值为0,方差为1,服从正态分布的白噪声信号u(n)
u_mean=mean(u)
u_power=var(u)
%输出其均值和方差
set(gcf,'position',[180,160,800,500]);
%设置图片显示位置为(180,160)
%设置图片大小为(800,500)
subplot(221)
plot(u(1:100));
%选取u(n)序列的前100个数据点
grid on;
%显示网格
xlabel('n');
ylabel('u(n)');
title('1-100的u(n)数值显示');
%坐标轴设置
subplot(222);
hist(u,50);grid on;
%对u2(n)作直方图,检验其分布。50是对u2(n)的取值范围(0-1)所分解的细胞数
h=findobj(gca,'Type','patch');
set(h,'facecolor','b');
%改变柱状图颜色
%显示网格
xlabel('u(n)');
ylabel('个数');
title('u(n)的直方图,均值为0,方差为1');
%坐标轴设置
subplot(223)
p_2=0.1;
%为新需要得到的方差赋值
a=sqrt(p_2);
%求取缩放因子a
u1=a*u;
%得到功率(方差)为0.1的序列u1
hist(u1,50);grid on;
%对u1(n)作直方图,检验其分布。50是对u1(n)的取值范围(0-1)所分解的细胞数
%显示网格
u1_mean=mean(u)
u1_power=var(u)
%输出其均值和方差
h=findobj(gca,'Type','patch');
set(h,'facecolor','r');
%改变柱状图颜色
axis([-4,6,0,4000])
%设置坐标轴显示范围
xlabel('u1(n)');
ylabel('个数');
title('u1(n)的直方图,均值为0,方差为0.1');
%坐标轴设置
subplot(224)
u2=3+u;
%设置均值为3
hist(u2,50);grid on;
%对u2(n)作直方图,检验其分布。50是对u2(n)的取值范围(0-1)所分解的细胞数
%显示网格
u2_mean=mean(u)
u2_power=var(u)
%输出其均值和方差
h=findobj(gca,'Type','patch');
set(h,'facecolor','r');
%改变柱状图颜色
axis([-4,6,0,4000])
%设置坐标轴显示范围
xlabel('u2(n)');
ylabel('个数');
title('u2(n)的直方图,均值为3,方差为1');
%坐标轴设置
在我们执行完以上程序后,我们则将会得到以下图示:
另外在执行结束之后,我们也可以在输出行看到我们的各个数据的值
u_mean =
-0.0010
u_power =
1.0034
u1_mean =
-3.2553e-04
u1_power =
0.1003
u2_mean =
2.9990
u2_power =
1.0034
我们也可以看到,以上各个数值均是我们所需求的那样。