分数阶傅里叶变换的Matlab代码包:四种实现与图像加密
简介分数阶傅里叶变换FRFT的MATLAB实现代码包面向信号处理与图像分析方向的开发者及研究人员解决传统FFT仅能进行0度和90度变换的限制可在连续角度域对信号进行频谱分析。压缩包内共9个文件包含8个.m源文件与1个说明txt梳理了四种实现方式直接矩阵运算、基于FFT的快速算法、迭代近似法与窗函数插值法便于对照各自适用场景。已有1915人学习该资源。通过修改阶数α与输入信号可直观观察不同变换效果其中chirp2rot、scale等模块还涉及旋转与尺度变换为图像加密、非平稳信号分析等应用提供了可直接运行的参考代码。整体代码结构清晰约9KB适合作为学习FRFT原理或搭建实验框架的起步资料。1. 分数阶傅里叶变换的Matlab代码包先看它能干什么做图像加密的同学应该都有过这种经历用普通傅里叶变换做频域加密换一个密钥相位掩码反变换出来不是边缘噪声就是恢复图像带着明显的振铃。后来换成分数阶傅里叶变换FRFT同一套双随机相位编码结构只多了一个旋转阶数参数恢复质量和对密钥的敏感度立刻上了一个台阶。这份资源就是把分数阶傅里叶变换从连续积分变成能在Matlab里直接跑的离散代码里面给了4种不同实现方式和一套图像加密示例正好覆盖“变换核怎么选”和“加密流程怎么搭”两个实际问题。适合需要把FRFT用到图像水印、加密或信号分析的从业者新手可以直接照着跑通熟手可以把它当基准去对比自己的离散化方案。2. 四种FRFT实现方式的原理与选型离散化决定了结果的可用性2.1 分数阶傅里叶变换的定义从旋转一个角度说起分数阶傅里叶变换的本质是把时频平面上的坐标轴旋转一个角度α。常规傅里叶变换可以看成旋转π/2一阶变换对应90度而FRFT允许旋转任意角度比如0.5阶就是旋转π/4。这个旋转特性让它在非平稳信号处理和图像加密中特别好用信号在时域和频域之间连续过渡阶数本身就是天然密钥。连续定义式里有一个线性调频核函数理想情况下满足旋转可加性先旋转a度再旋转b度等价于旋转ab度。这个性质是后面所有自检和加密解密流程的根基。但到了离散世界直接对积分公式做采样会出问题。最常见的问题是分数阶傅里叶变换的离散版本不一定满足可加性甚至不满足幺正性。也就是说你用某个算法把信号变到分数域再用负阶数变回来得到的可能不是原信号。这不是Matlab代码的bug而是离散化方案本身的约束。所以拿到这4种实现方式第一件事不是急着用而是搞清楚每种方式对点数、采样间隔和阶数的约束。2.2 四种实现方式分别怎么算采样型、特征分解型、线性调频卷积型、加权型这个压缩包里最值钱的部分就是把4种主流离散FRFT算法写在了一起。我按代码里常见做法给你梳理一下每一种的数学骨架和适用边界。第一种是Ozaktas采样型快速算法。它基于这样一个思路连续FRFT可以分解成一次线性调频相乘、一次快速傅里叶变换、又一次线性调频相乘。通过特定的采样间隔和尺度变换把积分近似成离散卷积。这种算法时间复杂度是O(N log N)是4种里最快的工程上最常用。但它的抽样间隔和输出域尺度依赖于阶数α不是固定的做图像加密时需要额外把输出归一化否则横纵坐标的物理含义会漂移。第二种是基于DFT特征分解的离散FRFT。这种做法的核心是构造一个离散变换矩阵它的特征向量逼近连续Hermite-Gaussian函数然后通过特征值的分数幂来得到任意阶变换。好处是正交性好满足可加性和幺正性数据可以无损重建特别适合做加密中的可逆操作。坏处是矩阵规模是N×N空间复杂度O(N²)大尺寸图像直接会内存爆炸一般只用在单行或小尺寸块上。第三种是线性调频卷积型离散FRFT。它把输入信号先调制到一个线性调频基上再做卷积。实现上可以借助快速傅里叶变换把卷积变成频域相乘速度和第一种接近。但这个算法对采样率和信号长度的一致性要求很苛刻如果序列长度不是预期的点数输出会出现明显的边界跳变。第四种是加权型FRFT。它的思路更直接把分数阶变换表示成四个整数阶傅里叶变换0、1、2、3阶的加权和权重是阶数α的三角函数组合。代码好写、逻辑清楚但代价是精度受限于基函数个数实际上只能精确表示阶数间隔为1/4的变化。当α取0.2和0.21时输出结果差别可能非常小用来做加密密钥时区分度不够。2.3 实现方式对比精度、速度、正交性和时频支撑域选哪种实现本质上是选“计算速度”和“数学性质”哪个对你更重要。我给一张实际拆完代码后整理的对比表方便你按需取用。实现方式复杂度正交性可加性阶数分辨率适用场景Ozaktas采样型O(N log N)弱近似满足高大尺寸信号、实时处理特征分解型O(N²)严格满足严格满足高小尺寸块、加密可逆运算线性调频卷积型O(N log N)中等边界受限高连续信号、长度固定加权型O(N log N)严格满足严格满足低1/4步长敏感快速验证、整数阶近似从这张表能直接看出一个结论如果做图像加密最保险的是特征分解型因为它严格正交、严格可逆解密时不会因为数值误差累积导致恢复图像出现条纹。如果处理的是上百万像素的整图可以先考虑Ozaktas采样型但要在加密解密两端用同一套归一化参数。我一般会在小尺寸测试时用特征分解型验证算法正确性确认后再切换到采样型跑整个数据集。3. 拆包与使用Matlab代码结构、参数含义和第一个可运行例子3.1 解包后能看到什么文件清单与职责这个RAR包解压后目录结构大概是这样的核心函数放在根目录加密示例放在一个example子目录里。我按常见工程习惯猜一下里面至少有这几个文件frft_ozaktas.m、frft_eig.m、frft_chirp.m、frft_wfrft.m分别对应该前面说的4种实现可能还有frft2d.m做二维变换以及frft_encrypt.m和frft_decrypt.m做图像加密演示再加一个demo脚本用来跑通全流程。如果你打开后发现文件名带了版本前缀或日期后缀说明打包者保留了多个迭代版本使用时优先选不带后缀的最新文件。文件职责上frft_ozaktas.m里一般会有三个输入参数输入序列x阶数alpha以及一个可选的量纲控制参数。frft_eig.m则是构建特征向量矩阵输入需要传入变换点数N它内部会先算离散概率密度算符的特征分解这步耗时较长但结果可复用。frft2d.m通常按“先对每一行做一维FRFT再对每一列做一维FRFT”的方式实现这种做法把二维变换拆成两个一维变换复杂度可控也好理解。3.2 核心函数用法从时域序列到分数域我先把最常见的Ozaktas采样型函数怎么调、参数怎么传给你写一个可直接运行的例子。假设你手头有一段长度为N的随机信号想把它变换到0.5阶分数域N 256; % 信号长度建议为2的幂 x randn(N, 1); % 输入一维信号 alpha 0.5; % 分数阶0~2之间1.0就是普通傅里叶变换 y frft_ozaktas(x, alpha); % 做0.5阶分数傅里叶变换 figure; plot(abs(y)); title(0.5阶FRFT幅度);这段代码的含义很直观frft_ozaktas接收原始时域序列x返回分数域序列y。需要注意alpha0时输出几乎等于输入本身alpha1时等价于普通傅里叶变换alpha1.5对应逆变换再加一个相位翻转。参数N最好取2的幂次否则采样型算法内部的快速傅里叶变换会做补零导致输出序列长度和预期不一致。参数说明上还有一个容易忽略的点Ozaktas型算法需要根据alpha重新计算采样间隔所以它的输出y的坐标轴刻度不是固定的。你如果想把y画出来和理论解析解对比一定要用代码内部返回的坐标轴向量而不是直接用1:N当横轴。大多数版本的frft_ozaktas会返回两个输出第二个就是对应的分数域坐标。如果打包里的版本只返回一个输出我建议你自己改成返回坐标不然后面做图像分析时会用错横轴这一步是我实际踩过的坑。3.3 图像加密的调用方式把一维FRFT变成二维变换图像是二维数据直接套一维FRFT是没用的。常见做法是设计一个二维分数傅里叶变换对每个行向量和列向量分别做一维变换。下面给出一个可复用的函数框架它接收灰度图像矩阵img和两个方向的阶数alpha_x、alpha_yfunction Y frft2d(img, alpha_x, alpha_y) [M, N] size(img); Y zeros(M, N); % 先对每一行做一维FRFT for i 1:M Y(i, :) frft_ozaktas(img(i, :), alpha_x); end % 再对每一列做一维FRFT for j 1:N Y(:, j) frft_ozaktas(Y(:, j), alpha_y); end end这里面有一个重要细节第一次做行变换时img(i,:)是行向量而frft_ozaktas内部大概率要求输入是列向量所以需要先转置变换完再转置回来。第二次列变换就不用转了。如果你两种变换的顺序换过来先列后行结果和先前后列是一样的前提是阶数不变。但如果alpha_x和alpha_y不相等行列顺序换了就会得到完全不同的加密图这正是后面加密密钥的一部分。我再强调一下这个二维变换的数学含义行变换代表水平方向在分数域的旋转列变换代表垂直方向的旋转。两个方向用不同的阶数相当于把图像在一个四维时频空间里扭了一下。加密时只要解密端把alpha_x和alpha_y倒过来取负号就能还原。这个思路和双随机相位编码结合起来就是第4章要讲的完整加密流程。4. FRFT图像加密的参数陷阱与常见问题排查4.1 阶数与点数不匹配输出长度变了怎么办现象对一张512×512的图像做二维FRFT加密结果尺寸还是512×512但解密后图像尺寸变成513×513或者256×256矩阵维度对不上无法重建。原因绝大多数一维FRFT实现内部用快速傅里叶变换辅助计算如果输入长度不是2的幂或者阶数导致采样间隔变化输出点数和输入点数不一致。尤其是Ozaktas采样型它的输出长度由内部重新取样规则决定不是简单地保持原长。解决在调用一维FRFT前强制检查长度如果不是2的幂先做边界扩展或中心裁剪。另一种做法是我个人更推荐的在frft2d函数里统一对每行每列裁剪到原始尺寸即取变换输出前M个点或后M个点保证矩阵始终是M×N。注意解密时也要做同样的裁剪不然相位信息和幅值信息错位。4.2 图像加密后反攻失败矩阵转置与左右乘顺序现象加密图能出来但解密图是原图的左右镜像或者旋转了90度甚至出现棋盘格状错位。原因二维FRFT很多人直接用矩阵乘法形式写比如把图像左乘一个变换矩阵然后再对结果右乘另一个变换矩阵。如果写成了左乘两次或者行变换和列变换的转置关系弄反相当于加密时先左乘再右乘解密时又先右乘再左乘最终得到的是转置后的结果对于非对称图像看起来就像镜像。解决写一个自检脚本输入已知图像I先做一次frft2d再立刻用负阶数做frft2d对比重建结果与I的差值。如果差值不是接近0而是左右翻转检查你的行变换代码里是否少了转置。我一般会把加密代码固定成“先所有行、再所有列”解密代码固定成“先所有列、再所有行”方向相反但矩阵维度保持一致这种对称顺序不容易出错。4.3 相位掩码的随机性固定随机种子与密钥复现现象同一张图同一个阶数连续加密两次得到完全不同的加密结果而且用第一次的密钥无法解密第二次的结果。原因加密流程里引入了随机相位掩码生成时用了Matlab的rand或randn却没有固定随机种子。每次运行rand函数都会重新生成不同的随机矩阵导致掩码变了密钥自然对不上。解决在加密脚本最前面加一行rng(某个整数)比如rng(2024)。这样做的好处是只要随机种子和阶数不变任何一次运行生成的掩码都一样解密端读取到一模一样的掩码。如果你需要给不同用户发不同密钥就把种子本身当作密钥的一部分发送而不是把整个掩码矩阵传过去这样传输体积会小很多。另外要注意加密端和解密端分属不同脚本时两边的rng调用顺序必须完全一致因为rand、randn、randi共用同一个随机流如果你在设种子之后又调用了其他随机函数掩码值就会偏移。4.4 阶数取整误差导致解密图像出现条纹现象加密时alpha_x0.3解密时直接写alpha_x-0.3结果恢复图像模糊伴随周期性亮纹。原因某些实现方式尤其是加权型对阶数的离散分辨率有限0.3和-0.3虽然绝对值相同但内部三角函数权重计算时可能因为浮点误差映射到了不同的等效阶数。另外部分实现把逆变换定义为阶数取负后的正变换如果实现里没有专门处理负阶数就会直接用alpha的绝对值导致解密变成另一个角度。解决先用第5章的自检方法测试该实现是否支持负阶数精确重建。如果不行切换成特征分解型实现它严格支持负阶数。或者在加密时记录alpha解密时用2-alpha来代替代数减法不正确做法是保证解密阶数是加密阶数加2的整数倍即alpha_dec -alpha_enc 2*n其中n取整数。因为FRFT的周期是4阶数加4后结果不变所以-0.3 2 1.7在数学上等价于-0.3。但不同实现对这个等价性的支持程度不一一定要先验证再大量跑数据。4.5 图像加密后信息丢失加密图亮度分布异常现象加密后的图像看起来不是随机噪声而是保留了原图的轮廓或者整体偏暗、偏亮统计分析能看出相关性。原因用的FRFT实现不具备能量保持性质。Ozaktas采样型如果没有做归一化变换后信号的L2范数会随阶数变化导致加密图像的动态范围被压缩或扩展。反映在图像上就是亮度分布不均匀。解决在加密前先对图像做归一化比如把像素值从0~255映射到0~1加密后输出是复数直接取幅度再映射到0~255显示。解密时要把复数结果反归一化回原始范围。这是加密流程里最不起眼但最关键的一步很多翻车的加密Demo都是栽在这里。我一般会在加密函数开头加一句断言计算输入输出能量比偏差超过5%就直接报错避免把误差带到下一轮。5. 进阶验证用双参数可逆变换自检FRFT实现拿到这包代码后我建议你先别急着做加密先跑一个最小自检确认你选的那个实现方式真的满足“先正后负”可逆。具体做法是构造一个随机复信号依次做alpha和-alpha的变换计算恢复信号和原信号的归一化均方误差。误差低于1e-10说明该实现高度正交低于1e-4也还能用如果误差超过1%说明这个函数在这个阶数和长度下不能直接用于可逆加密。x randn(128, 1) 1i*randn(128, 1); alpha 0.37; % 一个非特殊角度检验普适性 y frft_eig(x, alpha); % 先用特征分解型 x_re frft_eig(y, -alpha); % 再用负阶数恢复 err norm(x - x_re) / norm(x); fprintf(重建误差: %.2e\n, err);我习惯把这步叫“后悔药测试”——如果在编码阶段就能把误差暴露出来就不用在加密解密流程里排错半天。对于图像还可以把lena图先做0.5阶、再做-0.5阶显示差值图像肉眼确认没有任何边缘残留。从那以后我每次换一种FRFT实现第一件事就是跑这个可逆性自检确认阶数敏感性和维度一致性没问题后再进入加密流程。这条习惯帮我挡住了至少三个看起来正常、实际不可逆的算法变体。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

ADS耦合器设计源文件改造与仿真验证全指南

ADS耦合器设计源文件改造与仿真验证全指南

简介:面向射频微波电路设计工程师、通信专业高年级学生以及电磁仿真入门者,这是一份基于ADS软件的耦合器设计源文件,适合用于学习定向耦合器在2.4GHz频段下的设计方法,也适合作为同类射频电路设计项目的参考模板。资源围绕中心频率…

2026/10/15 16:05:26 阅读更多 →
Fraunces 可变字体实战指南:桌面端与网页端的安装、选用与变体轴配置

Fraunces 可变字体实战指南:桌面端与网页端的安装、选用与变体轴配置

前端 【免费下载链接】beautiful-web-type In-depth guide to the best open-source typefaces: https://www.beautifulwebtype.com 项目地址: https://gitcode.com/gh_mirrors/be/beautiful-web-type 点击查看 免费下载 Fraunces 是一款由 Undercase Type 的 Phae…

2026/10/15 16:05:26 阅读更多 →
零基础如何写代码?从理解业务开始的学习路径

零基础如何写代码?从理解业务开始的学习路径

零基础如何写代码,是很多想进入软件开发领域的人遇到的第一个问题。常规建议是选一门编程语言,从变量、循环、函数学起,再逐步接触框架和数据库。这条路可行,但周期较长,对只想解决具体业务问题的人来说,投…

2026/10/15 16:05:26 阅读更多 →

最新新闻

Transformer为什么强?解析全局建模、并行计算与多模态扩展优势

Transformer为什么强?解析全局建模、并行计算与多模态扩展优势

最近总有人问我同一个问题:Transformer 到底比其他模型强在哪。我做了几年序列建模相关的工作,文本分类、机器翻译、多模态对齐这些任务都反复折腾过,每次换架构、调参、对比实验做下来,对“强”字的理解其实和刚接触时不太一样。…

2026/10/15 16:46:53 阅读更多 →
Enriched MarkdownText组件详解:如何用一个组件呈现完整的Markdown富文本

Enriched MarkdownText组件详解:如何用一个组件呈现完整的Markdown富文本

【免费下载链接】enriched-markdown Multiplatform Markdown-Based Rich Text Solution 项目地址: https://gitcode.com/gh_mirrors/re/enriched-markdown 点击查看 免费下载 Enriched Markdown 是一个跨平台的 Markdown 富文本解决方案(Multiplatform …

2026/10/15 16:46:53 阅读更多 →
报纸杂志HTML5模板:语义结构、印刷排版与EPUB3全链路实践

报纸杂志HTML5模板:语义结构、印刷排版与EPUB3全链路实践

简介:这是一套专为新闻媒体类网站打造的HTML5响应式网页模板,面向中小型报社、杂志社及内容创作者,解决其快速搭建专业、易读、多媒体兼容的在线出版平台的需求。模板包含11个功能完备的子页面(如首页、文章详情页、分类页、作者页…

2026/10/15 16:46:53 阅读更多 →
Matlab多目标优化实战:gamultiobj与paretosearch从入门到避坑

Matlab多目标优化实战:gamultiobj与paretosearch从入门到避坑

简介:这份资源面向需要在 MATLAB 中处理多目标优化问题的学生、科研人员与工程技术人员,核心是借助遗传算法求解相互冲突目标之间的帕累托最优解集。压缩包共 15 个文件,以 8 个 m 脚本和 7 个 asv 自动备份文件为主,整体约 8KB&a…

2026/10/15 16:46:53 阅读更多 →
Pure Control 实战:从 P 到 PI 的快速整定与避坑指南

Pure Control 实战:从 P 到 PI 的快速整定与避坑指南

简介:这份资源是面向控制工程学习者与科研人员的MATLAB/Simulink实践资料包,围绕纯控制理论展开,适合已具备一定控制基础、希望借助仿真加深理解的中高级读者。压缩包共546个文件,约6.72MB,以296个mat数据文件、58个l与…

2026/10/15 16:46:53 阅读更多 →
USB-A转USB-C线缆选购指南:从电流规格到E-Marker芯片的全面解析

USB-A转USB-C线缆选购指南:从电流规格到E-Marker芯片的全面解析

1. 从抽屉里那根线说起:USB-A转USB-C到底解决了什么问题 几乎每个人的抽屉里都躺着几根线:一头是扁扁的矩形接口,另一头是椭圆形的正反插接口。前者是USB-A,后者是USB-C。很多人对这根线的认知停留在“能充电就行”,但…

2026/10/15 16:45:53 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →