@Jim Clay:不,如果过滤器变化缓慢,那么点击就会消失。所以我猜过滤器需要慢慢变化以避免听到咔哒声。
我在 matlab 中创建了一个测试,我将时域滤波与频域滤波进行比较。这两个操作产生相同的输出,但是当我定期切换过滤器参数时,我会听到音频中的咔嗒声。我该如何解决?
这是我的脚本:
clc
close all
clear all
[x,fs] = wavread('audiosignal');
x = x';
numberOfFilterTaps = 256;
NFFT = numberOfFilterTaps * 2;
z1 = zeros(1,numberOfFilterTaps-1);
blockSize = 64;
numberOfSamples = length(x);
h1 = fir1(numberOfFilterTaps-1, 0.5);
h2 = fir1(numberOfFilterTaps-1, 0.9);
blockCounter = 0;
ola = zeros(1,NFFT);
enableThis = 1;
switchCounter = 0;
while 1
idx1 = 1 + blockSize * blockCounter;
idx2 = blockSize + blockSize * blockCounter;
if (idx2 > numberOfSamples)
break;
end
idx = idx1:idx2;
sampleBlock = x(idx);
% Switch filter periodically
if (switchCounter == 0)
switchCounter = 0;
if (enableThis)
h = h1;
H = fft(h,NFFT);
enableThis = 0;
else
enableThis = 1;
h = h2;
H = fft(h,NFFT);
end
end
switchCounter = switchCounter +1;
if (switchCounter > 60)
switchCounter = 0;
end
% Method #1
[y1(idx),z1] = filter(h,1,sampleBlock,z1);
% Method #2
tmp = real(ifft(fft(sampleBlock, NFFT) .* H));
tmp = tmp + ola;
ola = [tmp(blockSize+1:end) zeros(1,blockSize)];
y2(idx) = tmp(1:blockSize);
blockCounter = blockCounter + 1;
end
wavwrite(y1,fs,'output_y1');
wavwrite(y2,fs,'output_y2');