我们在学校有一项任务是创建一个 DTMF 解码器,但无法理解需要做什么以及如何做。首先,我们需要使用卷积计算信号的能量。我们通过使用窗口长度和输入信号的绝对值来做到这一点:
SmoothEnergyOfInputSignal = conv(abs(X), ones(1,winlen)/winlen); %moving average
现在,我们不知道如何获得合适的窗口长度。平滑后的能量用于对信号进行分段,然后使用基向量(?)确定信号中的不同频率。dtmf 脉冲至少有 40 毫秒,间隔至少 40 毫秒。采样频率为 8kHz,我们的信号长度约为 17601 个样本。我们认为通过 fs*0.04 我们可以得到窗口长度。0.04=40ms,但现在平滑的能量信号发生了偏移,因此这些段超出了输入信号的最大样本。
[Sound, fs] = audioread('dtmf_all.wav');
winlen = fs*0.04
E = conv(abs(Sound),ones(1, winlen)/winlen)
长话短说:我们如何计算“正确”的窗口长度?
提前致谢。
编辑:说明已更新,我们不应该使用卷积。我们应该使用 filter()