【问题标题】:MATLAB - Hamming window, overlap 50%MATLAB - 汉明窗,重叠 50%
【发布时间】:2016-10-30 16:16:02
【问题描述】:

所以我编写了一些代码,它获取一个音频文件并将 16000hz 分成 320 个样本的帧。

我已经取了每一帧的汉明窗,如代码所示:

fs=16000;
[x,fs] = audioread('01.wav');

%Pre-emphasis filter (Y[n]=X [n]-0.95x[n - 1])
b = [1 -0.95];
y = filter(b,1,x);

%windowing
numSamples = length(y);
frameLength = 320;
numFrames = floor(numSamples/frameLength);
for frame = 1:numFrames,
   firstSample = (frame * frameLength) - (frameLength - 1);
   lastSample = (frame * frameLength);

   shortTimeFrame = y(firstSample:lastSample);
   h = hamming(320);

   hs = h.*shortTimeFrame;
   plot(hs, 'r');
end

然后如何将汉明窗重叠 50%? 我在 SO 上看到了其他问题,并看到了这样的答案:

y = buffer(h, 1, floor(64 * 0.5));

但是运气不好

【问题讨论】:

    标签: matlab hamming-window


    【解决方案1】:

    查看buffer 函数的文档。

    第一个参数是您的信号(即不是汉明窗)。如果你这样做:

    Y = buffer (x, 320, 160)
    

    你会得到一个矩阵Y,你的信号被分割成重叠的帧;也就是说,Y 的每一列大小为 320(即一帧),并且一列的最后 160 个元素与下一列的前 160 个元素相同。

    将您选择的汉明窗口应用于每个“帧”就是将每一列与汉明窗口相乘的简单情况,例如

    hammed_Y = Y .* repmat (h(:), [1, size(Y, 2)]);
    


    inb4pedants:repmat 不是最有效的方法,但它最清楚地展示了这个概念。如果可能,首选bsxfun,(或以八度音阶广播)。

    【讨论】:

    • 所以 Y = Buffer.. 不在 for 循环中,而 hammed_Y 在?我不知道 repmat 是什么,我是 matlab 新手
    • repmat 沿维度重复矩阵。在我的示例中,h(:) 确保 h 采用“列”形式,repmat 沿行重复一次(即不重复),size(Y,2) 沿列重复一次。这为您提供了一个与Y 大小相同的矩阵,其中所有列都相同(即您的h),因此您可以以“矢量化”的方式执行“逐元素”与 Y 的简单乘法。不需要任何循环。
    • 有没有办法可以绘制整个波形重叠?
    • 什么意思?您想分别绘制每一帧(汉明后)吗?请注意,这不是在不同间隔对整个信号应用(填充的)汉明窗。这只是产生一堆相同大小的帧进行处理。
    • 哦,好的,我明白了。所以我必须遍历 hammed_Y 才能对每一帧进行光谱分析?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多