傅里叶变换及其实现(MATLAB)

傅里叶变换及其实现(MATLAB)傅立叶变换傅立叶变换是一种常见的分析方法,傅立叶变换将满足一定条件的函数表示为一些函数的加权和(或者积分)。可以分为四个类别:1.非周期连续性信号对应于傅里叶变换,频域连续非周期2.周期性连续性信号对应于傅立叶级数,频域离散非周期3.非周期离散信号对应于DTFT(离散时间傅立叶变换),频域连续周期4.周期性离散信号对应于D

大家好,又见面了,我是你们的朋友全栈君。

傅立叶变换

傅立叶变换是一种常见的分析方法,傅立叶变换将满足一定条件的函数表示为一些函数的加权和(或者积分)。可以分为四个类别:
1. 非周期连续性信号
对应于傅里叶变换,频域连续非周期
2. 周期性连续性信号
对应于傅立叶级数,频域离散非周期
3. 非周期离散信号
对应于DTFT(离散时间傅立叶变换),频域连续周期
4. 周期性离散信号
对应于DFT(离散时间傅立叶变换),频域离散周期

傅立叶级数

首先从傅立叶级数开始分析,傅立叶级数是将一个信号在一组正交基上进行分解的体现。

x(t)=∑k=−∞+∞akejkω0t x ( t ) = ∑ k = − ∞ + ∞ a k e j k ω 0 t




ak=1T∫T/2−T/2x(t)e−jkω0tdt a k = 1 T ∫ − T / 2 T / 2 x ( t ) e − j k ω 0 t d t

连续时间傅立叶变换

ω0=2πT ω 0 = 2 π T ,当 T→∞ T → ∞ 时, ω0→0 ω 0 → 0 ;
令 X(jω) X ( j ω ) 是 Tak T a k 的包络,用 kω0→ω k ω 0 → ω ,推出:
正变换:

X(jω)=∫+∞−∞x(t)e−jkω0tdt X ( j ω ) = ∫ − ∞ + ∞ x ( t ) e − j k ω 0 t d t



其中

ak a k
是

X(jω) X ( j ω )
的等距离采样,

ak=1TX(jkω0) a k = 1 T X ( j k ω 0 )


所以当

T→∞ T → ∞
时,

ω0→0 ω 0 → 0
,可以推出:



x(t)=∑akejkω0t=∑1TX(jkω0)ejkω0t=∑12πX(jkω0)ejkω0tω0 x ( t ) = ∑ a k e j k ω 0 t = ∑ 1 T X ( j k ω 0 ) e j k ω 0 t = ∑ 1 2 π X ( j k ω 0 ) e j k ω 0 t ω 0


极限时转变为积分:


逆变换:


x(t)=12π∫+∞−∞X(jω)ejωtdω x ( t ) = 1 2 π ∫ − ∞ + ∞ X ( j ω ) e j ω t d ω

离散时间傅立叶变换

离散时间傅立叶变换在频域上是连续的,但由于计算机无法表示无限长的时间片段,已经无法表示全部频率,一般取一定频域的分量。
正变换:

X(ejω)=∑n=−∞+∞x[n]e−jωn X ( e j ω ) = ∑ n = − ∞ + ∞ x [ n ] e − j ω n




逆变换:


x[n]=12π∫2πX(ejω)ejωndω x [ n ] = 1 2 π ∫ 2 π X ( e j ω ) e j ω n d ω

离散傅立叶变换

只有离散傅立叶变换在频域和时域都是离散的,即计算机可以处理的,因此DFT是可以实际进行编程并实用的。DFT的信号首先要进行截断,因为能处理的信号必须是有限的;然后对信号进行采样,对频谱进行离散化。
正变换:

X(k)=∑n=0N−1x(n)e−j2πNnk X ( k ) = ∑ n = 0 N − 1 x ( n ) e − j 2 π N n k




逆变换:


x(n)=1N∑k=0N−1X(k)ej2πNnk x ( n ) = 1 N ∑ k = 0 N − 1 X ( k ) e j 2 π N n k

二维傅立叶变换

F(u,v)=∑x=0M−1∑y=0N−1f(x,y)e−j2π(ux/M+vy/N) F ( u , v ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − j 2 π ( u x / M + v y / N )




f(x,y)=1MN∑x=0M−1∑y=0N−1F(u,v)ej2π(ux/M+vy/N) f ( x , y ) = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 F ( u , v ) e j 2 π ( u x / M + v y / N )

傅立叶变换实现

只有离散傅里叶变换才可以实现,在MATLAB中实现有fft,fft2进行傅里叶变换,同样可以手动进行变换。

一维傅立叶变换

基于FFT

% xn是信号,n是坐标,N是点数
% N =8;
% n = [0:1:N-1];
% xn = 0.5.^n; % 指数信号
function [] = DFTusefft(xn,n,N)
    figure(1);
    Xk=fft(xn,N);      % 傅立叶变换
    subplot(211);
    stem(n,xn);
    title('原信号');

    subplot(212);
    stem(n,abs(Xk));
    title('FFT变换')
end

这里写图片描述

DFT公式

function [] = DFT(xn,n,N)
    Xk = zeros(1,N);    
    for k=1:N
        sn =0.0;
        for i=1:N
            sn = sn+xn(i)*exp(-j*2*pi*i*k/N);
        end
        Xk(k) = sn;
    end
    figure(2);
    subplot(211);
    stem(n,xn);
    title('原信号');

    subplot(212);
    stem(n,abs(Xk));
    title('DFT')
end

这里写图片描述

DTFT
由于DTFT的频域是连续的而且是无穷的,当我们选择的最高频域足够高时,可以基本代表信号特征,可以进行编程。

function [] = testDTFT(xn,n,N)
    figure(3);
    w=[-800:1:800]*4*pi/800;     %频域共-800----+800 的长度(本应是无穷,高频分量很少,故省去) 
    w = [-N/2:1:N/2]*4*pi*2/N;
    X=xn*exp(-j*(n'*w));         %求dtft变换,采用原始定义的方法,对复指数分量求和而得
    subplot(211)
    stem(n,xn);
    title('原始信号(指数信号)');
    subplot(212);
    plot(w/pi,abs(X));
    title('DTFT变换')
end

这里写图片描述

二维傅立叶变换

原始图像

这里写图片描述

使用fft2

function [] = imagefft()
    I=imread('lenna.jpg');
    I=rgb2gray(I);
    I=im2double(I);
    F=fft2(I);
    F=fftshift(F);
    F=abs(F);
    T=log(F+1);
    figure(4);
    imshow(T,[]);
end

这里写图片描述

使用二维傅立叶变换公式
速度很慢

function [] = imageDFT()
    I=imread('lenna_s.jpg');
    I=rgb2gray(I);
    I=im2double(I);
    [x,y] = size(I);
    ans = ones(x,y);
    com = 0+1i;
    for u =1:x
        for v= 1:y
            sn =0;
            for i=1:x                
                for j=1:y
                    sn = sn+I(i,j)*exp(-com*2*pi*(u*i/x+v*j/y));
                end
            end
            ans(u,v) = sn;
        end
    end
    F=fftshift(ans);
    F= abs(F);
    F=log(F+1);
    figure(5);
    imshow(F,[]);
end

这里写图片描述

优化二维傅立叶变换
先按列进行傅里叶变换,再对行进行傅立叶变换,简化计算。

function [] = imageDFT2()
    I=imread('lenna.jpg');
    I=rgb2gray(I);
    I=im2double(I);
    [x,y] = size(I);
    Ax = ones(x,y);
    ans = ones(x,y);
    com = 0+1i;
    % 对每一列进行DFT
    for k =1:x        
        for m=1:y
            sn =0;
            for n =1:x
                sn =sn + I(n,m)*exp(-com*2*pi*k*n/x);
            end
            Ax(k,m) = sn;
        end
    end
    % 对每一行进行DFT
    for l =1:y
        for k =1:x
            sn =0;
            for m=1:y
                sn = sn+Ax(k,m)*exp(-com*2*pi*l*m/y);
            end
            ans(k,l) = sn;
        end
    end    
    F=fftshift(ans);
    F= abs(F);
    F=log(F+1);
    figure(6);
    imshow(F,[]);
end

这里写图片描述

优化二维傅立叶变换
将按列进行傅里叶变换中使用DFT改为使用fft,速度提升很快。

function [] = imageDFT2fft()
    I=imread('lenna.jpg');
    I=rgb2gray(I);
    I=im2double(I);
    [x,y] = size(I);
    Ax = ones(x,y);
    ans = ones(x,y);
    com = 0+1i;
    % 对每一列进行DFT 
    for m=1:y
        Ax(:,m) = fft(I(:,m));
    end
    % 对每一行进行DFT 
    for k=1:x
        ans(k,:) = fft(Ax(k,:));
    end
    F=fftshift(ans);
    F= abs(F);
    F=log(F+1);
    figure(7);
    imshow(F,[]);
end

这里写图片描述

github地址

如有错误,欢迎指出~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160848.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Cookie中的httponly的属性和作用

    Cookie中的httponly的属性和作用1.什么是HttpOnly?如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。XSS全称CrossSiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其…

    2022年6月29日
  • 开源!!!100 多个常用 API 数据接口免费分享!建议收藏![通俗易懂]

    开源!!!100 多个常用 API 数据接口免费分享!建议收藏![通俗易懂]点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方有惊喜留言必回,有问必答!每天08:15更新文章,每天进步一点点…我们在开发的过程中,常常调用API接口,往往事半功倍。今天给大家整理了优秀的API接口!各类无次数限制的免费API接口整理,主要是聚合数据上和APIStore上的一些,还有一些其他的。聚合数据提供30大类,160种以上基…

    2022年9月17日
  • ajax html例子,AJAX实例[通俗易懂]

    ajax html例子,AJAX实例[通俗易懂]AJAX实例实例一:一个简单的AJAX实例创建一个简单的XMLHttpRequest,从一个TXT文件中返回数据实例functionloadXMLDoc(){varxmlhttp;if(window.XMLHttpRequest){//IE7+,Firefox,Chrome,Opera,Safari浏览器执行代码xmlhttp=newXMLHttpRequest();}els…

    2022年8月16日
  • 怎么获取Spring的ApplicationContext

    怎么获取Spring的ApplicationContext

    2021年12月10日
  • 动态规划 简单的分割问题的解决方案钢棒

    动态规划 简单的分割问题的解决方案钢棒

    2021年12月17日
  • 77道Spring面试题以及参考答案(2021年最新版)

    77道Spring面试题以及参考答案(2021年最新版)一、Spring概述1.什么是spring?Spring是一个轻量级Java开发框架,最早有RodJohnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEEfull-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。Spring可以做很多事情,它为企

    2022年5月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号