【问题标题】:Hanning (von Hann) window汉宁 (von Hann) 窗口
【发布时间】:2012-07-22 13:04:30
【问题描述】:
public short[] HanningWindow(short[] signal_in ,int pos ,int size)
{
    for (int i= pos; i < pos+size; i++)
    {
        signal_in[i] = (short) ((signal_in[i]) * ( 0.5 * (1-Math.cos( (2 * Math.PI * i) /    (size - 1))))) ;
    }
    return signal_in;
}

我正在尝试使用它

pos = (ring+delay*frame_rate*frame_size)%(frame_size*(frame_rate+1));
num = record.read(lin,pos,frame_size);           

GGSpecSub tempSpecSub = new GGSpecSub();
lin = tempSpecSub.HanningWindow(lin, pos, frame_size);

这是我第一次使用实时 DSP - 请告诉我这是否是将汉宁窗应用于信号的正确方法?

【问题讨论】:

    标签: java android signal-processing


    【解决方案1】:

    不,它需要更像这样:

    public short[] HanningWindow(short[] signal_in, int pos, int size)
    {
        for (int i = pos; i < pos + size; i++)
        {
            int j = i - pos; // j = index into Hann window function
            signal_in[i] = (short) (signal_in[i] * 0.5 * (1.0 - Math.cos(2.0 * Math.PI * j / size)));
        }
        return signal_in;
    }
    

    【讨论】:

    • pos 是 Android 正在使用 AudioRecord.read() 函数读取的位置。我在这里所做的是给出 11776 的整个 signal_in.length 并从中读取 512 个样本。为什么我必须做 int j = i - pos?
    • j 需要从0size - 1 取值,以便余弦函数在[0..2π) 范围内运行。
    • 否 - i 是样本索引 - 它从 pos 运行到 pos + size - 1。您不能将此值用于 Hann 窗口 - 您需要一个基于 0 的索引,因此需要 j
    • 好的,我明白了,如果你可以看看算法的其余部分。非常感谢stackoverflow.com/questions/11602126/…
    • 我查看并提出了一个建议 - 看起来您目前在 DSP 和编程方面都超出了您的深度,需要退后一步了解该算法的工作原理,然后再尝试做更多的编码。
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多