我正在做一个使用卷积在 Matlab 上生成回声的任务,我不明白wavread
实际做了什么。输出是我可以在卷积中使用的向量吗?
我试过了,得到一个错误“A和B必须是向量。”
另一个问题:如果我从波形文件中得到的信号是 ,我x(t)
怎么能得到x(t-4)
?
我正在做一个使用卷积在 Matlab 上生成回声的任务,我不明白wavread
实际做了什么。输出是我可以在卷积中使用的向量吗?
我试过了,得到一个错误“A和B必须是向量。”
另一个问题:如果我从波形文件中得到的信号是 ,我x(t)
怎么能得到x(t-4)
?
就像我在评论中所说的那样,您很可能正在尝试读取多通道音频文件,在这种情况下,wavread
很可能会返回一个NxM
数组,其中N
是样本M
数,是通道数。你能发布输出吗,输出在size(x)
哪里?x
wavread
根据您想要执行的操作,您可以在通道之间进行平均以获得单个音频矢量(如单声道)xAvg=mean(x,2);
,或者您可以选择一个特定的通道来使用 like xChannelK=x(:,k);
,1<=k<=M
选择的通道在哪里。
针对您上面关于零填充的评论,请记住,在n
点和m
点信号之间的卷积运算中,您最终会得到一个m+n-1
点输出。假设你想卷积A=[a1,a2,a3]
和B=[b1,b2,b3]
。您首先翻转一个向量,然后将其滑过另一个向量,同时逐点相乘并在每一步添加结果。
但是,当您将其翻转时,第二个向量在序列空间中未定义另一个函数的点处突出(反之亦然)。所以你需要用零填充它们,直到它们的长度相同。
通过一个例子可以更好地说明这一点。输出中的第一个点是
0 0 a1 a2 a3
b3 b2 b1 0 0
--------------------
0 + 0 + a1b1 + 0 + 0
--------------------
= a1b1
在这里,我们在未定义另一个的点处填充了零A
。B
输出中的第二点是
0 a1 a2 a3 0
b3 b2 b1 0 0
-----------------------
0 + a1b2 + a2b1 + 0 + 0
-----------------------
= a1b2+a2b1
等等。您应该阅读关于卷积的 wiki 文章以获取更多信息。但是,您不必手动执行此操作。MATLABconv
会自动为您执行此操作。所以你需要做的就是整理好你的向量,你就可以开始了。
是的,wavread 为其输出生成一个向量(使用 Matlab 帮助或从命令窗口键入“docsearch wavread”)。您还可以使用 isvector(x) 函数进行仔细检查。
Matlab 向量使用索引来识别向量中的位置,这里是您的信号 x。如果您以这种方式使用 wavread:
x = wavread(*filename*)
那么 x 可以作为 x 或 x(:) 或 x(1:end) 调用。如果您想引用 x(t-4),这一点很重要。如果 x(t) 可以表示为 x(1:end),那么 x(t-4) 应该是什么?
然而,诀窍是索引永远不能是负值,所以你不能只说 x(t-4) 是 x(-3:end-4)。对于卷积,您可能必须使用一些零填充,如果它尚未在您的卷积函数中完成。
我希望这个帮助能祝你好运!