摘要:本文简要介绍了matlab在音频信号处理,图象处理,卡尔漫滤波以及电路仿真中的一些应用。
关键词:matlab 音频信号处理 图象处理 卡尔漫滤波 电路坊真
引言:MATLAB 是matrixlabortory (矩阵实验室) 的缩写, 是1984 年由美国Mathworks 公司推出的数值计算及图形工具软件, 它最初是作为“矩阵理论”和“数据分析”等课程的计算工具, 经过十几年的发展和完善, 目前已成为世界各国在科学分析和计算领域的主流软件, 并被IEEE 评述为国际公认的最优秀的科技应用软件。
它的主要特点是:
( 1) MATLAB 可以用来解线性方程组、进行矩阵变换与运算、数据插值运算等,能使用户从繁杂的数学运算分析中解脱出来。
( 2) MATLAB 中有许多高级的绘图函数, 包括二维、三维、专用图形函数、图形句柄、用户图形界面工具等,利用这些函数可以轻松地完成各种图形的绘制和编辑工作, 实现计算
结果和编程的可视化。
( 3) 友好的用户界面及接近数学表达式的自然化语言,使学习者易于学习和掌握。
( 4) 功能丰富的应用工具箱(如信号处理工具箱,通信工具箱,控制系统工具箱等) 为用户提供了大量方便实用的处理工具。
MATLAB 的上述特点, 使它深受工程技术人员及科技专家的欢迎, 并很快成为应用学科计算机辅助分析、设计、仿真、教学等领域不可缺少的基础软件。目前, 国内很多理工院校已经或者正在把该软件作为学生必须掌握的一种软件。
本文简要介绍MATLAB应用于音频信号的频谱分析与合成,图象的频谱变换,简单卡尔漫滤波程序的设计,简单电源电路的仿真,是我对MATLAB软件平台应用的初步探索。
1. 基于MATLAB的音频信号的分析与合成
MATLAB 的最大特点是它的数据类型只有一种,即矩阵。它将所有的数据都处理成矩阵, 用户不必定义变量和数据类型, 且矩阵的大小也可任意改变。数字化的语音信号可作为一维或二维( 双声道立体声数据) 矩阵来处理, 因此MATLAB 很自然地应用到语音处理领域。
1.1. matlab应用于音频信号的频谱分析
频谱分析是信号处理中非常重要的分析手段,通常的频谱分析主要依靠传统的频谱分析仪来完成,但这种频谱分析仪价格昂贵,体积庞大,功能单一。采用先进的虚拟仪器技术设计的虚拟频谱分析仪彻底的改变了传统频谱分析仪的不足,用软件来代替硬件,用户可以根据具体情况通过修改软件来增加仪器的功能,使仪器功能更加强大,设计更加灵活,节省了开发时间,成为频谱分析仪的发展方向。
下面所介绍的频谱分析程序是设计虚拟频谱分析仪的基础,它利用傅立叶变换实现了对音频信号的频谱分析,同时调用sound函数和puse实现了声音信号的多次输出。
程序如下:
[fname,pname]=uigetfile('*.wav','Open Wave File');
file=[pname,fname];
[x,fs,bits]=wavread(file); % 读入声音文件(*.wav)
sound(x,fs,bits); % 数据通过声卡转换为声音
y=x(:,1); % 左声道信号波形数据
disp('按任意键显示左声道声音波形!!');
disp('----------------------------------------------');
pause
n=length (x) ;
t=0:1/fs:1/fs*(n-1);
plot(t,y);
title(['左声道声音波形']);
xlabel(['采样点数']);
disp('按任意键听左声道信号三次!!');
disp('----------------------------------------------');
pause
sound(y,fs,bits); % 数据通过声卡转换为声音
pause
sound(y,fs,bits);
pause
sound(y,fs,bits);
[k]=fft(y,32768);
disp('按任意键显示左声道声音频域的幅值!!');
disp('----------------------------------------------');
disp('----------------------------------------------');
pause
plot(abs(k));
title(['左声道声音频域的幅值']);
xlabel(['采样点数']);
[m1,i1]=max(abs(k)); % 找出频域最大值
F1=i1/32768*fs;
F1t=[num2str(F1) ' Hz'];
text(1500,450,F1t);
[m2,i2]=max(abs(k(4000:5000))); % 找出频域次大值
F2=(4000+i2)/32768*fs;
F2t=[num2str(F2) ' Hz'];
text(3000,40,F2t);
[m3,i3]=max(abs(k(10000:12000))); % 找出频域次次大值
F3=(10000+i3)/32768*fs;
F3t=[num2str(F3) ' Hz'];
text(8000,20,F3t);
WAV文件的输入方式采用 uigetfile 函数,该函数打开一个标准的对话框,然后可以选择声音文件的路径和文件的名称。信号波形生成使用绘图函就可以完成,而信号的频谱是通过快速付立叶变换而得到的。下面以打开音乐文件“背景音乐11.wav”为例,输出结果如图a所示:
1.2. MATLAB应用于音频信号的合成
下面介绍一种简单的音频信号的合成,图b所示输出结果的命令格式如下:
t=(0:0.0001:1);
y1=(sin(2*pi*788*t)+sin(2*pi*3174*t)*(22.65/490)+sin(2*pi*6936*t)*(2.996/490))*0.18;
disp('按任意键显示左声道简单合成声音波形!!');
disp('----------------------------------------------');
pause
plot(t,y1);
title(['左声道简单合成声音波形']);
disp('按任意键听简单合成左声道信号三次!!');
disp('----------------------------------------------');
pause
sound(y1,fs,bits); % 数据通过声卡转换为声音
pause
sound(y1,fs,bits);
pause
sound(y1,fs,bits);
[k1]=fft(y1,32768);
disp('按任意键显示左声道简单合成声音的频域幅值!!');
disp('----------------------------------------------');
disp('----------------------------------------------');
pause
plot(abs(k1));
title(['左声道简单合成声音的频域幅值']);
xlabel(['采样点数']);
[m1_r,i1_r]=max(abs(k1)); % 找出简单合成声音频域最大值
F1_r=i1_r/32768*10000;
F1_rt=[num2str(F1_r) ' Hz'];
text(3000,850,F1_rt);
[m2_r,i2_r]=max(abs(k1(10000:12000)));
F2_r=(10000+i2_r)/32768*10000; % 找出简单合成声音频域次大值
F2_rt=[num2str(F2_r) ' Hz'];
text(9000,60,F2_rt);
图b
2. 基于MATLAB的简单的图象处理
MATLAB 的图像处理工具箱功能十分强大, 支持的图像文件格式丰富, 如*.BMP 、*.JPEG、*.GIF、*.TIFF、*.PCX、*.HDF、*.XWD、*.PNG 等。MATLAB6.5
提供了15 类图像处理函数, 涵盖了包括近期研究成果在内的几乎所有的图像处理方法。这些函数按其功能可分为:图像显示; 图像文件I/O; 几何操作; 像素和统计处理; 图像分析;图像增强; 线性滤波; 线性二元滤波设计; 图像变换; 邻域和块处理; 二进制图像操作; 区域处理; 颜色映像处理; 颜色空间变换; 图像类型和类型转换。
利用这些图像处理工具箱, 并结合其强大的数据处理能力, 我们可不必关心图像文件的格式、读写、显示等细节, 而把
精力集中在算法研究上, 大大提高了工作效率。而且, 在测试这些算法时既可方便地得到统计数据, 同时又可得到直观图示。
下面将通过两个例子来简要介绍利用MATLAB 图像处理工具箱进行图像处理的方法。
2.1 用直方图均衡实现图像增强
图像增强的目的是突出图像中有用的信息, 削弱或消除不需要的信息。直方图均衡化是图像增强的一种常用方法, 它
能使图像的灰度分布均匀, 对比度增大, 细节更清晰。它的基本思想是把原始图像的直方图变换成均匀分布的形式, 这样
就增加了像素灰度值的动态范围, 从而达到了增强图像整体对比度的效果。
下面是用MATLAB 实现的源程序及注解, 输出结果图c。
I=imread('背景4.JPG' ); %读入图像文件
I=rgb2gray(I);
J=histeq(I,64); %对图像进行直方图均衡化, 指定均衡化后的灰度级数为64
subplot(2,2,1), imshow(I), title(' 原始图像' ); %显示原始图像
subplot(2,2,2), imhist(I,64), title(' 原始直方图' ); %显示原始直方图
subplot(2,2,3), imshow(J), title(' 直方图均衡化后的图像' );%显示直方图均衡化后的图像
subplot(2,2,4), imhist(J,64), title(' 直方图均衡化后的直方图' );
图c
通过比较可看出均衡化后的图像变得清晰, 其直方图形状也比原直方图的形状更理想。
2.1 计算图象的二维傅立叶变换
函数fft2应用于二维傅立叶变换,其语法格式为B=fft2(I);b=ftt2(I,m,n);
其中B=fft2(I) 返回图象的二维变换矩阵,输入图象I和输出图象的大小相同。B=fft2(I,m,n)通过对图象I剪切或补零,按用户指定的点数计算fft,返回矩阵B的大小为m*n。很多图象显示函数无法显示复数图象,为了观察傅立叶变换后的结果,应调用abs()函数对变换后的结果求模.
例如计算图象的二维傅立叶变换,并显示幅值的结果,如图d所示,其命令格式如下:
load imdemos saturn2;
imshow(saturn2);
B=fftshift(fft2(saturn2));
figure,imshow(log(abs(B)),[]);
colormap(jet(64));
colorbar;
图d
3. 基于MATLAB的简单卡尔漫滤波程序的设计。
卡尔曼滤波是二十世纪六十年代发展起来的一种滤波估值理论, 已广泛应用于通信、控制、空间科学、环境、经济预测等领域。
下面是简单的卡尔漫滤波程序,通过对比运行结果,可以看出卡尔漫滤波的结果和初值非常接近!其命令格式如下:
(1)产生原始信号和加噪信号
% modeling data
% sample number N=200 points
% sample time T=0.1s
t=0:0.1:20-0.1;
T=0.1;
% sample time
v=0.5;
% initial velocity
y=ones(1,200);
y(1)=0;
for n=2:200;
y(n)=y(n-1)+v*T;
end
figure(1);
plot(t,y,'-');
axis([0 20 0 20]);
xlabel('time');
ylabel('yp position');
title('the initial track of movement');
% add white gauss noise
a=0.5*randn(1,200);
s=y+a;
%data+noise
figure(2);
plot(t,s,'+');
axis([0 20 0 20]);
xlabel('time');
ylabel('yp position');
title('the track of movement with noise');
save initial_track s
(2)卡尔漫滤波
% kalman filtering
load initial_track
s; % y:initial data,s:data with noise
T=0.1;
% yp denotes the sample value of position
% yv denotes the sample value of velocity
% Y=[yp(n);yv(n)];
% error deviation caused by the random acceleration
% known data
Y=zeros(2,200);
Y0=[0;1];
Y(:,1)=Y0;
A=[1 T
0 1];
B=[1/2*(T)^2 T]';
H=[1 0];
C0=[0 0
0 1];
C=[C0 zeros(2,2*199)];
Q=(0.25)^2;
R=(0.25)^2;
% kalman algorithm ieration
for n=1:200
i=(n-1)*2+1;
K=C(:,i:i+1)*H'*inv(H*C(:,i:i+1)*H'+R);
Y(:,n)=Y(:,n)+K*(s(:,n)-H*Y(:,n));
Y(:,n+1)=A*Y(:,n);
C(:,i:i+1)=(eye(2,2)-K*H)*C(:,i:i+1);
C(:,i+2:i+3)=A*C(:,i:i+1)*A'+B*Q*B';
end
% the diagram of position after filtering
figure(3)
t=0:0.1:20;
yp=Y(1,;A
plot(t,yp,'+');
axis([0 20 0 20]);
xlabel('time');
ylabel('yp position');
title('the track after kalman filtering');
% the diagram of velocity after filtering
figure(4)
yv=Y(2,;
plot(t,yv,'+');
xlabel('time');
ylabel('yv velocity');
title('the velocity caused by random acceleration');
程序的运行结果,如图e所示,通过对比,可知卡尔漫滤波与原始信号非常接近。
图e
4. 基于MATLAB的简单电路的仿真
使用MATLAB软件进行电路仿真,具有突出的优势:仿真工具箱功能强大,工具箱内部的元件库提供了经常使用的各种电路元件数学模型,并且提供了可以自己编程的方式创建适合的元件模型。下面通过设计一个交流电路,来介绍MATLAB在电路仿真中的应用。
设计要求:如表1所示两个交流电压源的频率,幅值和相位是不同的,要求设计一个如图f所示的电路并输出所有电路元件的波形。
项目 | 频率/Hz | 幅值/v | 相位角/度 |
U1 | 50 | 75 | 20 |
U2 | 60 | 30 | 7.5 |
表1
图f
设计思路:从元件库中选择各元件,复制后粘贴在电路图中,设置好参数。仿真结果如图g所示:
图g
5. 总结
学好matlab需要长期的锻炼,我在短期中所掌握的甚少,许多知识还是“只可意会,不可言传“,有待进一步的学习和提高。由于时间紧张和水平有限,本文所列举的也是比较简单,容易操作的例子。
参考文献
1. 《信号与系统实验指导》---李方洲;
2. 《matlab电力系统设计与分析》---国防科技大学出版社;
3. 百思论坛——工程科技交流平台。
用户1645455 2011-4-6 19:34
用户1645455 2011-4-6 19:33