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;
答案 0 :(得分:2)
代码采用表示信号的数组。然后根据指定长度的窗口将其分成碎片,计算每个段中的能量,并找出哪些段的能量高于某个阈值。
让我们详细介绍一下代码:
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”值是第二个段,依此类推..
最后,下一行是计算每个段中的信号energy(以矢量化方式)。
energies = sqrt(sum(samples.*samples))';
答案 1 :(得分:1)
List<int> speech = new List<int>();
int window = 0;
int length = speech.Count();
int result = length % window;
int r = length - result;
// speech = speech(1: r, 1)
答案 2 :(得分:0)
此:
(length(speech) - mod(length(speech),window)
是一个公式
([length of speech] - [remainder of (speech / window)])
所以试试
(length(speech) - (length(speech) % window))
%
是等同于mod(..)
编辑我应该说我认为这是你代码中的mod(..)
:)