首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Matlab上实现波形文件的卷积

在Matlab上实现波形文件的卷积
EN

Stack Overflow用户
提问于 2011-04-26 08:29:05
回答 2查看 3.8K关注 0票数 0

我正在做一个使用卷积在Matlab上生成回声的任务,我不知道wavread到底做了什么。输出是可以在卷积中使用的向量吗?

我试了一下,得到一个错误:“A和B必须是向量。”

另一个问题:如果我从wave文件得到的信号是x(t),我怎样才能得到x(t-4)

EN

回答 2

Stack Overflow用户

发布于 2011-04-26 23:41:55

正如我在评论中所说的,您很可能正在尝试读入多声道音频文件,在这种情况下,wavread很可能会返回一个NxM数组,其中N是样本数,M是声道数。您能否发布size(x)的输出,其中xwavread的输出

根据您要执行的操作,您可以对各个通道进行平均,以获得单个音频矢量(如单声道)作为xAvg=mean(x,2);,也可以选择要使用的特定通道,如xChannelK=x(:,k);,其中1<=k<=M是所选的通道。

为了回应您上面关于补零的注释,请记住,在n点和m点信号之间的卷积操作中,您最终得到的是m+n-1点输出。假设您想要对A=[a1,a2,a3]B=[b1,b2,b3]进行卷积。首先翻转其中一个矢量,然后将其滑动到另一个矢量上,同时逐点相乘并在每一步中添加结果。

然而,当你翻转它时,第二个向量在序列空间中没有定义另一个函数的地方突出出来(反之亦然)。所以你需要用零填充它们,直到它们的长度相等。

举个例子可以更好地说明这一点。输出中的第一个点是

代码语言:javascript
复制
0   0    a1   a2  a3
b3  b2   b1    0   0
--------------------
0 + 0 + a1b1 + 0 + 0  
--------------------

 = a1b1

在这里,我们用AB填充了另一个未定义的点处的零。输出中的第二个点是

代码语言:javascript
复制
0    a1     a2    a3  0
b3   b2     b1    0   0
-----------------------
0 + a1b2 + a2b1 + 0 + 0
-----------------------

 = a1b2+a2b1

诸若此类。你应该通过wiki article on convolution了解更多信息。但是,您不需要手动完成此操作。MATLAB的conv会自动为你做这件事。所以你所需要做的就是把你的向量整理好,然后你就可以开始工作了。

票数 1
EN

Stack Overflow用户

发布于 2011-04-26 14:19:06

是的,wavread会为其输出生成一个矢量(使用Matlab帮助或在命令窗口中输入'docsearch wavread‘)。您还可以使用isvector(x)函数进行双重检查。

Matlab矢量使用索引来标识矢量中的位置,这里是您的信号x。如果您以这种方式使用wavread:

代码语言:javascript
复制
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)。对于卷积,您可能必须使用一些零填充,如果您的卷积函数中还没有这样做的话。

我希望这对你有所帮助,祝你好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5784707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档