从高频跳音中去除可听见的咔哒声

信息处理 声音的
2022-02-24 03:48:35

我的总声音持续时间为T.

我将持续时间分成几个子持续时间,并且在每个子持续时间中,我通过公式生成几个离散的正弦值sin(2πft)采样率为fs.

在连续的子持续时间中使用的频率是不同的。

现在,当我使用这些值(使用 matlab)生成声音时,我会在两个子持续时间相遇的点之间听到咔哒声;我想是因为不连续。如何消除这些可听见的咔嗒声?

编辑 我正在使用的代码(大致)

duration = 0.25;
sampleRate = 44100;
numberOfSamples = (duration * sampleRate);
frequency = 19000:500:21500;
freqHopSamples = [];

for j = 1:length(frequency)
    startIndex = ((j-1)*(numberSubSamples) + 1);
    endIndex = j*numberSubSamples;
    t = (startIndex:endIndex)/sampleRate;
    freqHopSamples(startIndex:endIndex) = sin(2*pi*frequency(j)*t);
end

wavwrite(freqHopSamples, sampleRate, 'sound.wav');
2个回答

一种方法是调整每个段开始处正弦曲线的相位,以最小化与最后一段结束处相位的第 1 或第 2 增量相位差。另一种方法可能会在每个边界调整几个样本以最小化多个导数。

您目前似乎从零相位开始,这可以随机化段之间的相位增量,具体取决于频率和段长度。

对我来说,最简单的想法似乎是编写 for 循环,以便仅当前一个波的值为 0 时才允许移动到新频率。显然,新频率也必须从值 0 开始绘制。

由于频率的性质意味着每个时间段的振荡量不同,因此当然不可能将它们放入不连续的子段中。

另一个选项可以是指定在发生新频率变化时发生的短幅度交叉衰减。它不必很长,例如 5 毫秒就足以消除点击。

现在,如果子段的长度必须完全相同,那么我将采用 hotpaw2 的建议,即计算需要使段对齐的相移。