【Matlab7】文件读写、声音、图像、Excel



2014年03月16日    Author:Guofei

文章归类: Matlab    文章编号: 11004

版权声明:本文作者是郭飞。转载随意,标明原文链接即可。本人邮箱
原文链接:https://www.guofei.site/2014/03/16/matlab7.html


4. 文件系统

保存:

save filename x -ascii -double

4.1. 文件夹操作

  • x=dir返回一个结构体,包含当前文件夹的所有信息
  • pwd 返回当前文件夹所在完整目录、
  • ls返回一个多列char,包含当前文件夹的内容
  • mkdir/rmdir 建文件夹/删文件夹 成功返回1
  • copyfile/movefile 复制/移动
  • addpath(路径),把路径临时添加到可用列表中(重启后失效)
  • rmpath(路径),把路径中可用列表中删除
  • addpath(genpath(pwd));%把当前全部目录都add
  • fullfile :用于将若干字符串连接成一个完整的路径
  • fileparts:fileparts用于将一个完整的文件名分割成4部分:路径,文件名,扩展名。例如:
    f=fullfile('D:','Matlab','example.txt');
    [pathstr,name,ext]=fileparts(f)
    % pathstr=D:\Matlab name=example ext=.txt versn=’’
    
  • 其它文件夹操作 filesep 用于返回当前平台的目录分隔符,Windows是反斜杠(),Linux是斜杠(/)。
  • pathsep 返回当前平台的路径分隔符。Windows是分号(;),Linux是冒号(:)。
  • exist 可以用于判断目录或者文件是否存在,不同的返回值有不同的含义。例如:
    >> f=fullfile('D:','Matlab','example.txt');
    >>exist(f)
    ans=2
    >>exist('D:\Matlab')
    ans =7
    
  • which 可以通过一个函数或脚本名称得到它的完整路径,同时还能处理函数重载的情况,例如:
    >> which abs(0)
    C:\MATLAB7\toolbox\matlab\elfun\@double\abs.bi  % double method
    >> which abs(single(0))
    C:\MATLAB7\toolbox\matlab\elfun\@single\abs.bi  % single method
    
  • isdir 判断一个路径是否代表了一个目录,例如:
    >> p='D:\Matlab';
    >> f=fullfile(p,'example.txt');
    >> isp=isdir(p)
    isp=1
    >> isf=isdir(f)
    isf=0
    
  • cd 用于切换当前工作目录。例如:
    >>cd('c:/toolbox/matlab/demos')        %切换当前工作目录到demos
    >>cd ..        %切换当前工作目录到matlab
    
  • pwd:返回当前工作目录的路径。例如:
    >> pwd
    ans =C:\MATLAB7\work
    
  • path:用于对搜索路径的操作。例如:
    <<path        %查询当前所有的搜索路径(MATLABPATH)
    <<p=path                %把当前的搜索路径存在字符串变量p中
    <<path(‘newpath’)                %将当前搜索路径设置为newpath
    <<path(path,’newpath’)        %向路径添加一个新目录newpath
    <<path(’newpath’, path)        %向当前搜索路径预加一个新目录nespath
    
  • what:用于显示出某目录下存在哪些matlab文件;若输入完整路径,可列出指定目录下的文件。
    <<what
    <<what dirname
    <<what(‘dirname’)
    其中dirname是要查找的路径的名字,路径在matlab的搜索路径内时,没有必要输入全名,只输入最后或最后两级就够了。
    

4.2 二进制读写

  1. fscanf
    %s   !!!问题:空格丢失
    %c   !!!没有上述问题,返回的是带空格和回车的char
    **可用于SQL语句的读写!**
    
  2. fget
    fgetl;%不返回换行符,是m-文件,调用fgets
    fgets%返回换行符,是build-in,可以指定字符数量
    
  3. textsan(最常用)
    适合读入大文件
    可以从任何位置开始读入
    **有很多变种,请doc后深入阅读**
    C = textscan(fileID,formatSpec,N)
    C = textscan(str,formatSpec,N)
    %3.1f  表示算上小数点,读入3位,小数点后1位
    *1d
    `*`表示跳过这个,不放到输出里面
    % 还有很多,详见帮助
    
  4. fread 读入的是ASCII码
  5. importdata(‘test1.txt’)
  6. textread
    [a,b,c]=textread('filename','format');
    逐渐被textscan取代
    调用了dataread函数
    C = textscan(fileID,formatSpec,N)
    C = textscan(str,formatSpec,N)
    
  7. dlmread和dlmwrite
    dlmread调用fread
    mat=dlmread('filename','\t')
    dlmwrite调用fwrite
    
  8. csvread,csvwirte
    csvread调用dlmread
    csvwrite调用dlmwrite
    

4.3 声音

傅里叶分析:

[y,Fs,bits]=wavread('cricket.wav');%读出信号,采样率和采样位数。
y=y(:,1);%我这里假设你的声音是双声道,我只取单声道作分析,如果你想分析另外一个声道,请改成y=y(:,2)
sigLength=length(y);
Y = fft(y,sigLength);
Pyy = Y.* conj(Y) / sigLength;
halflength=floor(sigLength/2);
f=Fs*(0:halflength)/sigLength;
figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');
t=(0:sigLength-1)/Fs;
figure;plot(t,y);xlabel('Time(s)');

去噪:

  1. 如果噪声是特定频率的周期噪声(periodic noise),比如说50hz,那么你可以用matlab的filter,作一个低通、高通、带通或者带阻滤波。
  2. 如果声音是高斯白噪声。那就用自适应滤波(adaptive filter,wiener filter)。这里涉及到对噪声的采样、计算特征值以及决定阶数的问题。
  3. 幸好我们可以“耍赖”——用cool editor。用它打开wav文件,用鼠标把一段噪声圈起来,采样,然后直接选择去噪就可以了。各大网站有介绍。

例子:matlab去除50hz噪声。

我用电脑录了一段声音,里面有50hz的周期噪声(因为受交流电干扰)。而我自己的声音频率最低是90hz。我使用了一个10阶butterworth高通滤波器,边带是70hz(介于50跟90之间)。
问题是,这不能直接用。因为声音文件的采样率是22k,70相对于22k来说太小了。所以我得先把我的声音欠采样,然后再滤波,然后再插值。程序如下。
[k,Fs,bits]=wavread('mywav.wav');
k=k(:,1);
y_temp=k(1:90000);
dfactor=3;
y=decimate(y_temp,dfactor);
[b,a] = butter(10,70/(Fs/(dfactor*2)),'high');
y=filter(b,a,y);
y=interp(y,dfactor);
sigLength=length(y);
Y = fft(y,sigLength);
Pyy = Y.* conj(Y) / sigLength;
halflength=floor(sigLength/2);
f=Fs*(0:halflength)/sigLength;
figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');
sigLength=length(y_temp);
Y = fft(y_temp,sigLength);
Pyy = Y.* conj(Y) / sigLength;
halflength=floor(sigLength/2);
f=Fs*(0:halflength)/sigLength;
figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');
t=(0:sigLength-1)/Fs;
figure;plot(t,y,t,y_temp);xlabel('Time(s)');
wavplay(y,Fs);
wavplay(y_temp,Fs);

回放:使用wavplay函数

wavplay(y,Fs);

4.4 图像

读入图像

y=imread('文件名')

A = imread(filename)
A = imread(filename,fmt)
A = imread(___,idx)
A = imread(___,Name,Value)
[A,map] = imread(___)
[A,map,transparency] = imread(___)
imshow(X,map)

idx:动图中的图片序号例如:

A = imread('corn.tif','PixelRegion',{[1,2],[2,5]});

表示读入1~2和2~5

显示图像

  • 方法1
    imshow(A)%A是矩阵
    imshow('pic.png')%直接显示图片文件
    
  • 方法2
    % imshow会自动拉伸,image不会自动拉伸
    image(A)
    
  • 方法3(索引图像)
    image(X);
    colormap(map);
    % 也可以这样:
    imshow(X,map)
    
  • 方法4(灰度图像)
    imshow(I,32)%32阶灰度
    imshow(I,[low,high])%自定义调色板
    

rgb2gray

I=rgb2gray(A)

图像写入文件

imwrite(imgGray,'gray.jpg')

数据结构:

  1. 真彩色:RGB的MN3矩阵,0~255整数
  2. 索引图像 索引矩阵+调色板

4.5 动画

  1. 动画生成:句柄方式
    set(h,'erasemode',erasemode)%h是需要执行动画图像的句柄,一般都是由line或者plot创建
    for i=1:n
     set(h,'xdata',xdata,'ydta',ydata)%更新图像的坐标数据
     drawnow%刷新屏幕后再执行下一条,如果不用drawnow,刷新和下一条语句将会同步执行
    end
    
  2. 动画保存:保存到变量和文件中
    for j=1:n
     %这里输入我们的绘图命令
     M(j) = getframe;
    end
    %%
    movie(M)
    %关于getframe:
    getframe(gcf), getframe(gca),getframe(h,rect)
    [left bottom width height]
    %movie:显示到屏幕
    movie(M,n,fps)
    %RGB转M
    M=IMmovie(RGB)
    %单帧显示方法
    image(M(1).cdata)
    
  3. 保存到gif的方法
    for i=1:30
     im=frame2im(M(i));
     [I,map]=rgb2ind(im,256);
     if i==1
         imwrite(I,map,'out.gif','gif','loopcount',inf)
     else
         imwrite(I,map,'out.gif','gif','writemode','append')
     end
    end
    

4.6 Excel

[num,txt,raw,custom] = xlsread(filename,sheet,xlRange,'basic',processFcn)

xlswrite(filename,A,sheet,xlRange)
filename = 'testdata.xlsx';
A = {'Time','Temperature'; 12,98; 13,99; 14,97};
sheet = 2;
xlRange = 'E1';
xlswrite(filename,A,sheet,xlRange)

4.7 SQL

配置:

1. 安装mysql_installer_community_V5.6.21.1.msi  
2. 将mysql-connector-java-5.1.33-bin.jar文件拷贝到......\MATLAB\R2015b\java\jar\toolbox  
3. 到......\MATLAB\R2015b\toolbox\local目录下,找到classpath.txt文件,打开,并添加用来加载mysql的jdbc驱动语句:  
$matlabroot/java/jar/toolbox/mysql-connector-java-5.1.33-bin.jar  
4. 重新打开MATLAB即可  

使用:

%代码功能:从txt中读入sql语句,执行sql语句

file_name='sql_all.txt';
bid=fopen(file_name,'r');
sql_sq=fscanf(bid,'%c');
fclose(bid);
conn = database('tennis','root','1234','com.mysql.jdbc.Driver','jdbc:mysql://localhost:3306/');
ATP=fetch(conn,sql_sq)

4.8 压缩

  • zip
  • unzip:解压ZIP到当前文件夹,并返回文件名列表
    unzip(zipfilename)
    unzip(zipfilename,outputdir)
    filenames = unzip(zipfilename,outputdir)
    
  • gzip:把文件压缩为.gz格式
    gzip(files)
    gzip(files,outputdir)
    filenames = gzip(...)
    
  • gunzip 解压.gz到当前文件夹(GNU)
    gunzip(files)
    gunzip(files,outputdir)
    gunzip(url, ...)
    filenames = gunzip(...)
    
  • tar 支持 .tgz或.tar
    tar(tarfilename,files)
    tar(tarfilename,files,rootfolder)
    entrynames = tar(...)
    tar('backup.tgz','.');
    
  • untar

4.9 各种print

  1. Print: 把函数图形保存成图片
    用法:先plot,然后
    print('-dpng','文件名.png')
    -dbmp:保存为bmp格式
    -djpeg:保存为jpeg格式
    -dpng:保存为png格式
    -dpcx:保存为pcx格式
    -dpdf:保存为pdf格式
    -dtiff:保存为tiff格式
    
  2. fopen:文件打开
    fid = fopen('filename','permission')
    fid: (正整数):表示文件打开成功,文件代号是N.
    fid=-1 : 表示文件打开不成功。
    permission:
    r读取,必须存在
    w 写入,不存在则创建,存在则覆盖
    a 写入,创建,存在则不覆盖而是添加
    r+ 读+写,不存在则不创建
    w+ 读+写,创建,覆盖
    a+ 读+写,创建,不覆盖而是添加(追加式打开)
     W 写,无自动刷新功能
    A 读,无自动刷新功能
    
  3. fclose:用完记得关闭
  4. 二进制读写
    fread   二进制读
    fwrite  二进制写
    ftell    返回文件位置指针
    fseek  移动文件位置指针
    
  5. 文本读写:fprintf,fscanf
    fprintf %把数据写入文本文件中
    fprintf(bid,format,data)
    %c 单个字符
    %d 有符号十进制数(%i也可以)
    %u 无符号十进制数
    %f 浮点数(%8.4f表示对浮点数取8位宽度,同时4位小数)
    %o 无符号八进制数
    %s  字符串
    %x 小写a-f的十六进制数
    %X 大小a-f的十六进制数
    fscanf(fid,format,size)
    
  6. 屏幕显示
    fprintf%显示在屏幕上
    

4.a 网页

网页读写:

url=['http://dc.simuwang.com/product/HF00000AJV.html']
XML_data=urlread(url);
fid=fopen('kline.txt','w');
fwrite(fid,XML_data);
fclose(fid)

用默认浏览器打开网页:

web('http://www.ilovematlab.cn/forum-238-1.html','-browser')

ftp

f = ftp(host,username,password)

书推荐

  1. 【强烈推荐】matlab与数学试验 国防工业出版社 全面介绍了matlab的各种应用,值得注意的是:数值积分试验,微分方程试验,随机模拟实验,加密方法试验,分形模拟试验,遗传算法试验
  2. 傅里叶变换及其应用 布雷斯威尔 西安交通大学出版社 好书!包含拉普拉斯变换,扩散方程,成像技术等,值得看!!
  3. 数理统计及其在数学建模中的实践(done)
  4. matlab入门到精通:符号计算,电路模拟,simulink
  5. 精通matlab,计算篇(插值,傅立叶分析,偏微分方程),计算实例
  6. 数理统计与数据分析
  7. matlab实用指南(上下)电子工业出版社 书比较薄,比较深

您的支持将鼓励我继续创作!