function [ samples,y, energies] = energy( speech, fs )
window_ms = 200;
threshold = 0.75;
window = window_ms*fs/1000;
speech = speech(1:(length(speech) - mod(length(speech),window)),1);
samples = reshape(speech,window,length(speech)/window);
energies = sqrt(sum(samples.*samples))';
vuv = energies > threshold;
y=vuv;
我有这个matlab代码,我需要用c#编写此代码。但是我不明白代码的最后一部分。我也认为语音对应于根据代码第一部分的数据列表或数组。如果不是,请有人可以解释此代码的作用。我只想知道逻辑。fs = 1600或3200;
该代码采用表示信号的数组。然后,它根据指定长度的窗口将其分为几部分,计算每个段中的能量,然后找出哪些段的能量高于某个阈值。
让我们详细了解一下代码:
speech = speech(1:(length(speech) - mod(length(speech),window)),1);
上一行基本上是确保输入信号的长度是窗口长度的倍数。假设speech
是一个由11个值组成的数组,并且窗口长度为5,则代码将仅保留前10个值(从1到5 * 2),除去最后一个剩余的一个值。
下一行是:
samples = reshape(speech,window,length(speech)/window));
也许最好用一个简单的例子来解释一下:
>> x = 1:20;
>> reshape(x,4,[])
ans =
1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20
因此,它将数组重塑为“ k”行(k是窗口长度)和完成数组所需的列数的矩阵。因此,第一个“ K”值将是第一个段,下一个“ k”值将是第二个段,依此类推。
最终,下一行将计算每个段中的信号能量(以矢量化方式)。
energies = sqrt(sum(samples.*samples))';
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句