关于重叠添加的问题

信息处理 matlab 声音的 语音处理
2022-02-22 14:52:35

@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');
1个回答

这里的主要问题是您正在实现时变过滤器。FIR 滤波器和重叠算法仅在您的滤波器是时不变的情况下才有效。

如果需要时变滤波器,则需要解决两个问题:状态变量的连续性和输出波形的连续性。解决这个问题的最简单方法是基本上并行运行两个滤波器,然后在切换时在输出之间交叉淡入淡出。交叉渐变的时间常数决定了您获得的可听度,因此可以将其调整到所需的水平。