f(x)*(-1)^x的离散傅里叶变换及Matlab中如何绘制坐标轴

来源:互联网 发布:电脑笔记软件 知乎 编辑:程序博客网 时间:2024/06/08 08:09

今天在看图像处理的书时,想绘制一个普通函数的离散傅里叶函数,及领悟函数f(x)*(-1)^x的离散傅里叶变换相当于将原函数的离散傅里叶变换向左或向右平移半个周期。在绘制过程中,想要给图像添加一个坐标轴,发现,添加坐标轴还有点麻烦,对应我这个新手来说。后来经过一番百度,用到了mathworks的arrow函数,就是绘制出来的箭头有点大。代码如下。

clc;clear all;close all;x=ones(7,1)';%生成一个长度为7的矩形序列Fu=fft(x,140);%求序列的长度为63的离散傅里叶变换%Fu=[fliplr(Fu) Fu];%为了对称,在负轴也生成一个周期。Fu=[Fu,Fu];plot([-140:1:139],abs(Fu),'--');%绘制幅度谱xlabel('u');ylabel('|F(u)|');%annotation('arrow',[0 0],[0 1]);%annotation('arrow',[0.5 0.5],[0 1 ]);%[a,b] = ginput;xaxis=arrow([-140,0],[150,0]);%绘制x轴,起点为(-140,0),终点为(150,0)yaxis=arrow([0 0],[0 7.5]);%绘制y轴,起点为(0,0),终点为(0,7.5)%set(xaxis,'Facecolor',[0 1 0],'EdgeColor',[0 1 0]);%设置x轴的颜色为绿色xlim([-140,140]);ylim([0,7]);figure(2);a=[1:7];x=(-1).^a.*x;Fu=fft(x,140);%求序列的长度为63的离散傅里叶变换Fu=[Fu,Fu];plot([-140:1:139],abs(Fu),'--');%绘制幅度谱%plot(abs(Fu));xlabel('u');ylabel('|F(u)|');xaxis=arrow([-140,0],[150,0]);%绘制x轴,起点为(-140,0),终点为(150,0)yaxis=arrow([0 0],[0 7.5]);%绘制y轴,起点为(0,0),终点为(0,7.5)% %set(xaxis,'Facecolor',[0 1 0],'EdgeColor',[0 1 0]);%设置x轴的颜色为绿色xlim([-140,140]);ylim([0,7]);

 图片如下



        发现figure2相对于figure1平移了半个周期。
        在绘制坐标轴时利用的arrow函数见http://cn.mathworks.com/matlabcentral/fileexchange/278-arrow
        在绘制坐标轴时,网上有很多人说用annotation函数,常见的是annotation1 = annotation(figure1,'arrow',[0.131 0.131],[0.92 0.96]);annotation2 = annotation(figure1,'arrow',[0.88 0.96],[0.108 0.108]);但是这样基本上只使用于坐标轴在左下角的情况。而且,关于annotation的用法,这篇博客说的比较好:http://www.matlabsky.com/thread-13465-1-1.html。一个核心就是使用annotation绘制箭头时,annotation('arrow',x,y)      % 建立从(x(1), y(1))到(x(2), y(2))的箭头注释对象。annotation对象的父对象是figure对象,上面提到的坐标x,y是标准化的坐标,即整个图形窗口(figure对象)左下角为(0,  0),右上角为(1,  1)。宽度w和高度h也都是标准化的,其取值在[0,  1]之间。与图像中数据坐标不一致,存在bug,arrow函数很好第解决了这个问题。


原创粉丝点击