恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
基于维纳滤波与运动模糊PSF的图像加密算法及Matlab实现
首页
资讯中心
/
基于维纳滤波与运动模糊PSF的图像加密算法及Matlab实现
基于维纳滤波与运动模糊PSF的图像加密算法及Matlab实现
发布时间:2026/9/8 7:56:28
1. 项目概述与核心思路拆解1.1 这个项目到底在做什么先把这个标题拆开看基于维纳滤波器和运动模糊的点扩散函数的图像加密算法加上Matlab代码实现。听起来像是一长串名词堆在一起其实底层逻辑并不复杂——用光学成像中的“退化”过程来加密再用估计出的退化参数来解密。我在第一次接触这个方向时也有点懵图像加密怎么会跟“模糊”扯上关系但换个角度想就明白了你拍了一张清晰照片想发给别人但又不想让中间人直接看到内容于是你故意把照片“拍糊”。可这种糊不是随便糊而是带有特定参数的、可逆的模糊——只有知道参数的人才能把糊掉的照片恢复成清晰版本。在这里模糊参数就是密钥模糊过程就是加密恢复过程就是解密。这个思路放在图像加密领域里属于“光学加密”或“退化模型加密”分支。相比传统的置乱-扩散加密比如Arnold置乱、Logistic混沌序列异或它的优势在于加密过程本身就是光学/物理层面的信号退化不涉及复杂的代数运算解密端如果已知模糊参数用经典的图像复原技术就能恢复明文整个流程直观且易于硬件实现。这个项目适合谁如果你是学数字图像处理、光学成像或信息安全方向的学生尤其是要做课程设计、毕业设计或者导师丢给你一个“图像加密”题目而你又不想随大流做混沌加密——这个方案会是很不错的切入点既有理论基础退化模型、频域滤波、统计估计又有可量化的算法参数还能直接跑出视觉效果对比图。1.2 加密-解密整体流程设计要理解这个算法的设计思路得先明确它的加密-解密链路。我用最直白的方式描述加密端发送方取原始明文图像 f(x, y)选定一组运动模糊参数——模糊角度 θ 和模糊长度 L根据参数生成对应的点扩散函数 h(x, y)也就是运动模糊核将明文图像与点扩散函数做卷积得到模糊退化图像 g(x, y)。传输端加密后的图像 g(x, y) 看起来就是一张“拍糊了”的照片内容信息被掩盖第三方无法直接读取。解密端接收方收到模糊图像 g(x, y)用正确的参数生成相同的点扩散函数 h(x, y)通过维纳滤波进行去卷积从 g(x, y) 中恢复出尽可能接近原始 f(x, y) 的图像。听起来是不是很像图像复原的标准套路本质确实一样。但在这个项目里他被包装成了一个加密框架——因为不知道精确的模糊参数就无法构造正确的点扩散函数也就无法复原图像。参数空间角度 长度就是一个天然的密钥空间。我特别想强调这个设计的一个聪明之处它把“加密强度”和“参数敏感性”绑定在一起。如果你用错误的参数去解密得到的结果仍然是一团模糊甚至可能比密文本身还难看——这在视觉上给了很强的误导性增加了暴力破解的难度。下面这张图是我对整体流程的抽象描述建议你心里先有这个框架再往下读明文 → 参数化运动模糊(卷积) → 密文 → 传输 → 盲复原(维纳滤波) → 解密结果 ↑ ↑ PSF作为密钥 PSF作为密钥核心点解密的质量直接取决于PSF重建的准确度而PSF重建又完全取决于模糊参数的估计精度。所以整个项目的技术重心可以拆成三个关键问题怎么建模运动模糊PSF怎么用维纳滤波做最优复原怎么在Matlab里把全流程串起来下面依次展开。2. 运动模糊与点扩散函数加密“密钥”的数学模型2.1 为什么要用运动模糊做加密载体先回答一个最基础的问题图像加密方式那么多为什么单挑运动模糊我个人理解有三个原因。第一运动模糊是最容易数学建模的退化模型之一它的PSF有闭式表达式不像散焦模糊、大气湍流模糊那样需要复杂的参数拟合——这意味着你只要知道“角度”和“长度”两个参数就能精确重建PSF加密解密都有确定性的数学基础。第二运动模糊的视觉效果“糊得自然”。处理后的图像虽然掩盖了细节但整体轮廓和色彩分布还在视觉上不会引起怀疑也不会因为过度噪声化导致密文体积膨胀或传输困难。第三运动模糊退化是线性空间不变的可以用卷积模型统一描述频域里就是乘法操作这为后续用维纳滤波做逆运算提供了极大便利。当然它也有局限。只做运动模糊加密安全性上限并不高——攻击者如果猜测参数并尝试复原如果运气好蒙对了还是能解出来的。但作为学术研究、课程设计的载体这个方案的技术深度和可扩展性完全够用。实际工程中往往会在模糊加密的基础上再叠加置乱、混沌扩散等处理把安全性拉满。2.2 运动模糊点扩散函数的精确建模运动模糊的物理模型是在相机曝光时间内场景与成像平面发生相对匀速直线运动导致目标场景中的每个点在传感器上被“拉成一条线”。在数学上如果运动方向与水平方向夹角为 θ、像素位移长度为 L那么对应的PSF是一条沿 θ 方向长度为 L 的线段在连续域可以写为h(x, y) 1/L 用于满足条件的(x, y)线段上的点其他位置为0注意那个 1/L 的系数不是随便写的。点扩散函数必须满足能量守恒约束——所有元素之和等于1或者说 ∫∫ h dxdy 1。这样才能保证退化过程只改变图像的空间分布不改变整体亮度。这个约束在离散化实现中特别容易被忽略很多新手生成的PSF矩阵元素求和大于1结果模糊图像整体变亮解密图像亮度失真。实际工程中我们用的是离散化的PSF矩阵。假设图像尺寸是 M×N运动方向与 x 轴夹角为 θ像素长度 L那么PSF矩阵的运动痕迹要离散地画出来。实现方式有好几种我见的最多的做法是根据三角函数计算运动轨迹上的坐标点再对坐标取整后填充矩阵。这种做法的好处是简单直观坏处是当 θ 不是45度倍数时填出来的线段会有“锯齿”或断点PSF质量不够高。更精细的做法是采用亚像素采样。具体来说对长度 L 的线段在连续坐标上密集采样比如每0.1像素取一个点每个采样点都对周围四个像素做双线性插值分配权重最后再归一化。这样生成的PSF是一个带抗锯齿的平滑核模糊效果更自然解密质量也更高。下面我会给出具体代码实现。2.3 PSF作为加密密钥的敏感性分析既然把PSF参数当密钥那就要回答一个关键问题参数必须多精确才能正确解密如果不精确会怎样我专门做过一组实验来验证参数敏感性。用一张标准的Lena图像设定真实模糊参数为“角度45度、长度20像素”进行加密然后分别用以下错误的参数去解密角度偏移5度50度、长度不变长度减少2像素18像素、角度不变角度和长度同时偏移40度、18像素实验结果非常有意思角度偏移的影响比长度偏移更致命。角度偏移5度时恢复图像会出现明显的振铃伪影和方向性条纹图像基本不可用长度偏移2像素时图像会显得“欠复原”或“过复原”——长度偏小则图像边缘仍然模糊长度偏大会产生过冲和振铃。这说明该加密方案的密钥敏感度相当高从密码学角度看这是一件好事——参数空间的微小偏差就是破解失败的巨大开销。从密钥空间的角度估算一下如果模糊角度可以精确到1度180种模糊长度在1到50像素之间50种那组合就有 180×50 9000 种。这只是一个初级的密钥空间如果叠加模糊方向范围扩大0到360度和长度范围扩大密钥空间会呈线性增长。作为对比一个8位的灰度图像用AES加密密钥空间是 2^128完全不在一个量级。所以再次强调这个方案更适合作为研究原型或教学项目工程落地时建议叠加其他加密手段增强安全性。3. 维纳滤波解密原理为什么要逆滤波但又不直接用逆滤波3.1 退化模型与逆滤波的困境先说退化模型。在频域里图像的匀速直线运动模糊退化可以写成G(u,v) H(u,v) × F(u,v) N(u,v)这里 G、H、F、N 分别对应模糊图像、PSF、原始图像和加性噪声的傅里叶变换。你要做的“解密”本质就是已知 G 和 H反求 F。最直觉的做法是直接做除法F_est(u,v) G(u,v) / H(u,v)这个操作叫逆滤波。听起来干净利落但实际做出来的效果惨不忍睹。原因在于运动模糊PSF的频谱 H(u,v) 含有大量接近零的数值运动模糊本质是一个低通滤波高频段衰减非常快而且频谱上有周期性的零点你用一个接近零的数去除微小的噪声成分就会被无限放大恢复图像里全是雪花般的噪声点。噪声越大退化越严重逆滤波结果越离谱。换句话说逆滤波不是不能用而是在有噪声的情况下不能用。而实际系统里没有人能保证完全没有噪声——图像采集、量化、传输都会引入噪声所以必须找一种更稳健的反卷积方法。3.2 维纳滤波原理与公式推导维纳滤波Wiener Filter本质上是一种最小均方误差估计。它的目标不是“精确还原退化前的信号”而是找一个滤波器使得恢复图像与原始图像之间的均方误差期望值最小。这个思想来自于统计信号处理核心假设是把图像和噪声都看作随机过程且已知它们的功率谱密度。维纳滤波在频域的表达式大家应该都见过F_est(u,v) [ H*(u,v) / ( |H(u,v)|^2 K ) ] × G(u,v)这个公式就是把逆滤波的“除法”改成了“带正则化的除法”。当 K 0 时它就退化成标准逆滤波当 K 0 时分母始终不会变成零从而抑制了噪声放大。K 到底是什么学术定义是噪声功率谱与信号功率谱之比K S_n(u,v) / S_f(u,v)工程上为了简化通常把它当作一个常数处理通过手动调节来平衡“去模糊强度”和“噪声放大程度”。K 越小滤波越接近逆滤波细节恢复越锐利但噪声也越明显K 越大滤波越保守噪声被压住了但图像会比较平滑、丢失细节。这个参数在Matlab里对应的是 I 参数后面实操部分我会讲怎么调。另外注意公式里的 H*(u,v)——H的共轭。因为 H 是复数必须乘共轭再除以模平方才能保证输出的相位是“对齐”的这在数值实现时很容易写错。3.3 为什么维纳滤波在这里比盲反卷积更合适做图像复原的人可能马上想到现在不是有更高级的算法吗比如Lucy-Richardson迭代、盲反卷积盲解卷积为什么这个项目偏偏用维纳滤波我的理解是这与“加密-解密”这个应用场景息息相关。盲反卷积处理的场景是你既不知道原始图像也不知道PSF需要同时估计两者。但在我们这个项目里解密端是“合法接收方”他本来就该知道密钥PSF参数所以他不需要“盲估”只需要“精确复原”。在这种情况下维纳滤波这种非迭代、单步、计算量小的算法非常契合——解密速度快、代码短、实现简单而且数学形式优美。对比一下三种常见反卷积方案方案原理优点缺点逆滤波频域直接相除实现最简单噪声放大严重几乎不可用维纳滤波最小均方误差 正则化抗噪好计算快参数直观假设噪声平稳对参数K敏感Lucy-Richardson迭代最大似然估计迭代逼近复原质量高能处理非线性退化需要大量迭代计算量大可能放大伪影对于加密解密场景**“解密必须快速完成”**是很重要的需求。如果每次解密要跑几十次迭代用户体验会很糟。维纳滤波单次傅里叶变换乘除就能完成在Matlab里计算一张 512×512 的图像耗时不到 0.1 秒。当然如果导师要求你对比多种复原算法我也建议把Lucy-Richardson加进去作为对照实验既可以丰富论文内容又能突出维纳滤波在抗噪声和计算效率上的综合优势。4. Matlab完整实现从PSF生成到图像解密一键跑通4.1 生成运动模糊点扩散函数的核心函数先给出最关键的模块——运动模糊PSF生成函数。我提供的是带亚像素采样和抗锯齿处理的版本比简单取整法效果好很多建议直接抄走。function h generate_motion_psf(imgSize, theta, L) % imgSize - PSF矩阵尺寸一般为 [M, N] % theta - 运动方向与水平轴的夹角度 % L - 模糊长度像素 % % 返回值 h - 归一化的运动模糊点扩散函数 M imgSize(1); N imgSize(2); h zeros(M, N); % 将角度转换为弧度 thetaRad theta * pi / 180; % 取整到图像中心位置 cx floor(M/2) 1; cy floor(N/2) 1; % 亚像素采样每个像素区间采样10个点 numSamples max(10, round(L * 10)); half L / 2; for k 0:numSamples-1 % 沿运动方向的连续坐标偏移从 -half 到 half t -half (k / (numSamples-1)) * L; % 计算该采样点的连续坐标 x_cont cx t * cos(thetaRad); y_cont cy t * sin(thetaRad); % 双线性插值分配权重到周围四个像素 x0 floor(x_cont); y0 floor(y_cont); dx x_cont - x0; dy y_cont - y0; % 边界检查 if x0 1 x01 M y0 1 y01 N h(x0, y0 ) h(x0, y0 ) (1-dx) * (1-dy); h(x01, y0 ) h(x01, y0 ) dx * (1-dy); h(x0, y01) h(x0, y01 ) (1-dx) * dy; h(x01, y01) h(x01, y01 ) dx * dy; end end % 归一化保证PSF所有元素之和为1能量守恒 h h / sum(h(:)); end这个函数的核心思想就是把“一条线”上的连续能量分配到离散像素格点上。你可以对比一下不用亚像素采样、直接对坐标四舍五入取整的版本——后者在非水平、非垂直、非45度的角度下生成的PSF会有明显的断裂感模糊效果也差一些。多花这几行代码值。注意PSF的尺寸应该和图像尺寸一致。原因是频域乘法是基于逐点相乘的尺寸不一致会报错。如果为了节省内存想让PSF尺寸小一些那就需要用卷积的valid模式或者对PSF做FFT后对齐到图像频域尺寸但新手还是建议直接生成与图像同尺寸的PSF简单可靠。4.2 加密端生成模糊密文加密端的逻辑非常简洁——读图、生成PSF、频域卷积等价于空域卷积、输出密文。%% 加密端代码 clear; close all; clc; % 1. 读取明文图像并转为灰度 double 类型 I imread(lena.png); if size(I, 3) 3 I rgb2gray(I); end I im2double(I); [M, N] size(I); % 2. 设置“密钥”——运动模糊参数 theta 45; % 模糊角度单位度 L 20; % 模糊长度单位像素 % 3. 生成运动模糊PSF h generate_motion_psf([M, N], theta, L); % 4. 频域退化G H .* F % 注意fft2之后不需要fftshift因为频域乘法在未移位状态下直接对应 H fft2(h); F fft2(I); G H .* F; % 5. 逆傅里叶变换取实部得到密文图像 g real(ifft2(G)); % 6. 确保数值范围在 [0,1] 内 g max(0, min(1, g)); % 7. 显示并保存 figure; subplot(1,2,1); imshow(I); title(原始图像(明文)); subplot(1,2,2); imshow(g); title(运动模糊加密图像(密文)); imwrite(g, cipher_image.png);提一个很多人忽略的细节频域乘法做完后用real(ifft2(G))取实部是因为浮点误差会产生极小的虚部直接显示会报警告。另外输出前用max(0, min(1, g))做一次范围截断可以防止个别像素越界成负数或大于1导致显示异常。运行这段代码你就能看到加密效果原始Lena图像的纹理细节被沿45度方向“抹开”变得不可辨认。这就是加密端执行的“加密”操作全程只有一次FFT和一次逐点乘法速度极快。4.3 解密端维纳滤波恢复明文解密端的核心就是用维纳滤波公式做频域除法和正则化%% 解密端代码 clear; close all; clc; % 1. 读取密文模拟接收方收到的图像 g imread(cipher_image.png); if size(g, 3) 3 g rgb2gray(g); end g im2double(g); [M, N] size(g); % 2. 解密端恢复PSF相当于用密钥重建 theta 45; L 20; h generate_motion_psf([M, N], theta, L); % 3. 维纳滤波复原 H fft2(h); G fft2(g); % 维纳滤波参数K——信噪比倒数调节因子 K 0.01; % 维纳滤波核心公式 F_est (conj(H) ./ (abs(H).^2 K)) .* G; % 4. 逆傅里叶变换得到空间域恢复图像 f_est real(ifft2(F_est)); f_est max(0, min(1, f_est)); % 5. 显示并对比 figure; subplot(1,3,1); imshow(g); title(密文图像); subplot(1,3,2); imshow(f_est); title(维纳滤波解密结果); subplot(1,3,3); imshow(im2double(imread(lena.png))); title(原始图像(参考)); % 6. 计算PSNR和SSIM original im2double(imread(lena.png)); if size(original, 3) 3 original rgb2gray(original); end psnr_val psnr(f_est, original); ssim_val ssim(f_est, original); fprintf(PSNR %.2f dB, SSIM %.4f\n, psnr_val, ssim_val);运行后你就能直观看到解密效果。当 K0.01 时恢复图像基本能还原出Lena的清晰轮廓但边缘处会有轻微振铃。配合psnr和ssim两个指标你能量化评估解密质量。4.4 参数K怎么调一个被问爆的经验问题维纳滤波公式里的 K 值是解密质量的关键也是很多同学调参时最容易懵的地方。先说经验范围。对于归一化到 [0,1] 区间的无噪声或低噪声图像K 值通常在 0.001 到 0.1 之间取。K 太小比如 0.0001你实际上逼近逆滤波图像边缘会有密集振铃、噪声毛刺K 太大比如 0.5图像变得过度平滑像被磨皮了一样细节全丢。我通常从一个中间值 0.01 开始调然后以 10 倍步长上下搜索观察哪个值既保留了边缘锐度又看不到明显噪声。如果你的仿真里加了高斯噪声比如g g 0.01 * randn(M, N)那么 K 就必须相应增大因为需要更强的正则化来抑制噪声放大。噪声方差越大K 越大这是经验规律。如果觉得手动调参太麻烦可以写一个简单的循环遍历一组候选 K 值对每个 K 做一次解密计算与原始图像的 PSNR选 PSNR 最高的那个 K。搜索步长用对数等分比如K_list logspace(-4, -0.5, 20); % 从0.0001到约0.316 best_psnr 0; best_K K_list(1); for i 1:length(K_list) F_est (conj(H) ./ (abs(H).^2 K_list(i))) .* G; f_est max(0, min(1, real(ifft2(F_est)))); score psnr(f_est, original); if score best_psnr best_psnr score; best_K K_list(i); end end fprintf(最优K %.4f, PSNR %.2f dB\n, best_K, best_psnr);这算是一个改良版的自动调参方法。虽然不能保证是全局最优但作为工程近似已经足够。要注意的是搜索时一定要有“原始图像”作为参照否则没法算PSNR。在实际加密传输场景里接收方没有原始图像所以通常还是靠经验选一个保守的 K 值。4.5 一个值得对比的坑直接使用Matlab自带deconvwnr函数Matlab的Image Processing Toolbox里其实带了一个现成的维纳滤波函数deconvwnr。用法非常简单f_est deconvwnr(g, h, K);这里 h 是PSF矩阵K 是噪声-信号功率比。很多同学觉得直接调这个函数就行不用自己写公式。但我在实际项目里还是推荐自己手写一遍原因有三点第一deconvwnr要求的 PSF 是小尺寸核比如 20×20而不是与图像同尺寸的大矩阵——这跟我们的generate_motion_psf默认输出不太一样需要额外处理反而绕。第二手写维纳滤波你能真正理解每一步在做什么后面如果要改造成“参数未知下的盲复原”或者把公式扩展成约束最小二乘滤波比如用拉普拉斯算子做正则化你改代码非常顺手。第三自己写的代码在做参数敏感性实验、批量测试时更灵活不用每次去适配工具箱函数的输入输出格式。当然如果你的主要目的是快速验证算法效果那用deconvwnr完全没有问题。我给的建议是学习阶段手写实验阶段工具箱和手写并行验证——两边结果一致说明公式和代码都没写错。5. 实验设计、结果分析与常见问题排查5.1 设计一组完整的对照实验做这个项目如果只跑一张Lena效果图贴上去虽然能看但评审老师如果问到“为什么选这个参数”“换了图像还行不行”你会很被动。我的建议是至少跑三组实验让结果更有说服力。实验一不同模糊参数下的加密解密效果选一组参数对比 (θ30°, L10), (θ45°, L20), (θ60°, L30)。记录每组参数的解密 PSNR 和 SSIM。你会发现一个规律模糊长度越长加密效果越好密文与明文视觉差异越大但解密难度也越高PSNR 会有所下降。因为 L 越大PSF 频谱在高频段的衰减越严重H(u,v) 中接近零的点越多维纳滤波的恢复上限越低。实验二错误密钥解密——参数敏感性测试前面提过角度偏移5度、长度偏移2像素分别测试。这个实验在学术论文里特别加分因为它直接论证了“PSF参数 密钥”这一核心论点的安全性。建议把错误解密的结果画在一张图里直观展示“错一个参数就恢复不出来”。实验三噪声鲁棒性测试在密文上叠加不同程度的高斯噪声无噪声、σ0.005、σ0.01、σ0.02然后用不同K值维纳滤波解密记录 PSNR。这个实验能说明维纳滤波相比逆滤波的优越性——在有噪声的情况下逆滤波结果直接崩溃而维纳滤波还能保持一定质量。如果你想让项目更有深度这个实验一定要做。5.2 常见报错与现象排查速查表我把这个项目里新手最容易踩的坑整理成一张表方便你对照排查现象原因解决方案fft2后图像频域尺寸不匹配报错PSF尺寸与图像尺寸不一致PSF生成函数传入与图像相同的 [M,N]解密图像亮度整体偏暗PSF未归一化模糊过程能量丢失检查sum(h(:))是否为1解密结果有很多横向/纵向条纹K值偏小振铃效应明显增大K值或增加频域滤波窗恢复图像仍然模糊K值偏大正则化过度减小K值显示图像报复数警告ifft2结果有微小虚部用real()取实部PSF沿斜线方向有断点PSF生成用了简单取整改用亚像素双线性插值版本加密后图像很暗看不清图像未归一化或PSF能量不守恒确保im2double归一化图像PSF归一化解密出现边缘黑框频域乘法隐含周期性卷积导致边界效应可尝试padarray扩展或截断边缘边界效应值得单独拿出来说。频域乘法对应的是循环卷积circular convolution而不是线性卷积所以图像边界处会出现“卷绕”伪影。解决这个问题最常用的做法是加密前对图像做零填充padarray(I, [ceil(L/2), ceil(L/2)])解密后再裁掉填充部分。这在PSF长度较大时效果很明显推荐加入你的代码中。5.3 我对这个方案的一些改进建议代码跑通之后如果你想让它更有创新性我有几个具体的方向可供参考一是盲复原扩展。解密端不再假设已知PSF参数而是从密文图像的频谱中估计模糊角度和长度——模糊角度可以通过频谱暗条纹的方向来确定模糊长度可以通过暗条纹间距推算。实现后整个系统就从“对称密钥加密”升级成了一种近似“盲解密”的框架研究价值上了一个台阶。二是多帧或分块处理。把图像分块不同块用不同模糊参数加密相当于把密钥空间进一步扩大而且能抵抗某些针对单一PSF的攻击手段。解密时逐块用对应参数复原即可。三是与混沌加密结合。用Logistic混沌序列生成模糊角度和长度参数或者用混沌序列对密文再做一次置乱把传统加密的“扩散”特性和光学退化的“掩盖”特性结合。这种“光学数字”混合加密的结构是当前学术界的常见做法发小论文很有市场。四是深度学习辅助参数估计。如果对神经网络有了解可以训练一个小型CNN来预测模糊角度和长度替代传统的频谱分析法。这种“深度估计信号复原”的混合路线也比较新颖适合有编程基础的同学做进阶。5.4 写在最后的心得我在做这个项目时体会最深的一点是图像加密听上去是个高大上的方向但落地起来很多时候拼的还是基本功。FFT、卷积、滤波器设计、矩阵操作这些数字图像处理里最基础的知识在这个项目里被完整地串了起来。它不像纯调库的深度学习项目那样“黑盒”每一步你都能在纸上画出数学公式、在代码里找到对应实现——这种“理论能推导、代码能复现、结果能验证”的感觉恰恰是做研究最踏实的阶段。最后再分享一个小技巧调试时不要直接盯着整张图看可以在Matlab里用imshowpair或montage把原始图、密文、解密结果拼在一起看同时用psnr函数实时量化差距。数值指标能帮你快速判断是参数问题还是代码问题比人眼判断高效得多。如果你在这个方案的某个环节卡住了尤其是PSF生成和维纳滤波K值调参这两块建议多画几张图看看频谱——把fftshift(log(abs(H)1))显示出来观察频谱里的暗条纹方向你会对整个算法有更直观的理解。动手调试的过程往往比代码本身更有收获祝顺利。