impulse response 使用的踩坑 —— cconv

在 impulse response 的使用中遇到了小小的问题,具体如图,第一行是原始信号,第二行是响应的信号,在通过将原始信号和相应信号分别转换到频域求得 transfer function 后,ifft 得到 impulse response。第三行是原始信号和 ir 进行卷积得到的结果,可以看到在信号最开始的阶段,有一个意料外的响应。:

impulse response 使用的踩坑 —— cconv_第1张图片

这一段的代码如下:

% src: 原始信号
% resp: 响应的信号

Ssrc = fft(src);
Sresp = fft(rest);
Stf = Ssrc./Sresp;
ir = ifft(Stf);

z = conv(src,ir);

先说短的结论,把最后一条命令 conv 换为 cconv 即可。

impulse response 使用的踩坑 —— cconv_第2张图片

和 Daniel 探讨后,问题出在 得到的 ir 上。

impulse response 使用的踩坑 —— cconv_第3张图片

对于这个ir,是不能直接进行卷积的,而应该先做一个 circular shift ( ir = circshift(ir, Nshift), z = circshift(z, -Nshift) )。让响应变得完整。

impulse response 使用的踩坑 —— cconv_第4张图片

这样得到的响应就没有前面恼人的部分了。然而。。。。又出现了另一个问题,响应的后半部分消失了。。。。。

impulse response 使用的踩坑 —— cconv_第5张图片

最后就索性使用圆周卷积,结果完美。

% src: 原始信号
% resp: 响应的信号

Ssrc = fft(src);
Sresp = fft(rest);
Stf = Ssrc./Sresp;
ir = ifft(Stf);

z = cconv(src,ir,800); % 800因为信号的长度为800

impulse response 使用的踩坑 —— cconv_第6张图片

看来,信号处理的基本功还是不太扎实啊。

你可能感兴趣的:(学习笔记,Audio)