信号分析 | 二维傅立叶变换矩阵的实现方法

二维傅里叶变换的矩阵表示的理论可以参考以下博客或文章:
二维傅立叶变换矩阵
离散傅立叶变换的矩阵表示

可以通过编程实现矩阵表示,但是运算量很大。

我这里用MATLAB自带的dftmtx函数实现。
dftmtx()函数——离散傅立叶变换矩阵
句法

a = dftmtx(n);

n — 离散傅立叶变换长度,正整数
a = dftmtx(n) 返回一个 n-by- n复杂离散傅立叶变换矩阵。

对于列向量 x的傅立叶变换如下:

y = dftmtx(n)* x

与y = fft(x,n)相同。
离散傅里叶逆变换矩阵由正变换矩阵求共轭转置并除以系数而来,如下:

ainv = conj(dftmtx(n))‘ / n

用FFT计算离散傅里叶变换比使用DFT矩阵更有效。FFT还使用较少的内存。这两个过程给出相同的结果。

实际上,dftmtx函数是由fft(eye(n))实现的。
如:dftmtx(16) 与 fft(eye(16)) 等价。

一维傅立叶变换实例:

clear all;clc;
N = 512;
t = [0: N-1];
f = cos(2*pi/256*t) + sin(3*pi/128*t);  
Psi = fft(eye(N));  %正变换
iPsi = conj(fft(eye(N)))' / N;  %反变换  
F1 = fft(f);
F2 = Psi * f';
f1 = iPsi * F1';
F3 = dftmtx(N) * f';  %正变换
figure('name', '两种频谱计算方法对比');
subplot(2,2,1);plot(real(F1));title('FFT');
subplot(2,2,2);plot(real(F2));title('相乘计算结果');
subplot(2,2,3);plot(f);title('原信号');
subplot(2,2,4);plot(real(f1));title('相乘反变换结果');

结果对比:
在这里插入图片描述
二维傅立叶变换实例:

P = peaks(20);
X = repmat(P,[5 10]);  

P = dftmtx(100);
iP = conj(fft(eye(100)));
Q = dftmtx(200);
iQ = conj(fft(eye(200)));
Y = fft2(X);  %正变换
x = ifft2(Y);  %反变换
Y1 = P * X * Q;  %相乘正变换
x1 = iP * Y1 * iQ / (100 * 200);  %相乘反变换
figure;
subplot(2,2,1);imagesc(X);title('图像');
subplot(2,2,2);imagesc(abs(fftshift(Y))); title('FFT2D');
subplot(2,2,3);imagesc(abs(fftshift(Y1)));title('相乘正变换');
subplot(2,2,4);imagesc(real(x));title('相乘反变换');

结果对比:
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值