matlab - 如何使用 cconv 在 2 个函数之间进行循环卷积?
问题描述
我被要求通过使用函数对两个函数进行采样来在两个函数之间进行循环卷积cconv
。这种卷积的一个已知结果是:CCONV( sin(x), sin(x) ) == -pi*cos(x)
为了测试上面我做了:
w = linspace(0,2*pi,1000);
l = linspace(0,2*pi,1999);
stem(l,cconv(sin(w),sin(w))
但我得到的结果是:
这绝对不是-pi*cos(x)
。
谁能解释我的代码有什么问题以及如何修复它?
解决方案
在它的文档中cconv
说:
c = cconv(a,b,n)
循环卷积向量a
和b
.n
是结果向量的长度。如果省略n
,则默认为length(a)+length(b)-1
。当 时n = length(a)+length(b)-1
,循环卷积等价于用 计算的线性卷积conv
。
我相信你的问题的原因是你没有指定第三个输入cconv
,然后选择默认值,这不适合你。我制作了一个动画,展示了n
选择不同的值时会发生什么。
如果您将我的结果n=200
与您的绘图进行比较,您会看到数据的幅度大 10 倍,而您的长度linspace
大 10 倍。这意味着需要一些归一化,可能是linspace
一步的乘法。
事实上,在适当的缩放和选择之后,n
我们得到了正确的结果:
res = 100; % resolution
w = linspace(0,2*pi,res);
dx = diff(w(1:2)); % grid step
stem( linspace(0,2*pi,res), dx * cconv(sin(w),sin(w),res) );
这是我用于动画的代码:
hF = figure();
subplot(1,2,1); hS(1) = stem(1,cconv(1,1,1)); title('Autoscaling');
subplot(1,2,2); hS(2) = stem(1,cconv(1,1,1)); xlim([0,7]); ylim(50*[-1,1]); title('Constant limits');
w = linspace(0,2*pi,100);
for ind1 = 1:200
set(hS,'XData',linspace(0,2*pi,ind1));
set(hS,'YData',cconv(sin(w),sin(w),ind1));
suptitle("n = " + ind1);
drawnow
% export_fig(char("D:\BLABLA\F" + ind1 + ".png"),'-nocrop');
end
推荐阅读
- floating-point - 浮点数的表示(14bit)
- flutter - SetState 不更新对话框
- sqlite - SQLite 查询中选择语句的别名
- swiftui - SwiftUI 中具有交替行颜色的表格
- python - 通过将范围内的数字添加到末尾来创建多个变量
- pytorch - 在 TPU 上运行具有不同序列长度的 HuggingFace Transformers 是否每次都会导致 XLA 重新编译?
- javascript - 在 discord.js 中使用 Message ID 上传表情
- web-crawler - Apache Nutch Crawler - 仅在现有表中抓取新注入的 URL
- amazon-web-services - 预置 IOPS io1 卷上的 Amazon EBS 多重挂载,而不是跨实例复制数据
- android - 如何在改造 android 中设置 utf-8 编码?