假设我有一个包含 44100 个样本的文件,采样频率为 fs=44100 Hz。
所以我的文件是 1 秒长。
我想将其下采样到 8 Hz 的采样频率,但我不想通过获取每个 44100/8 = 5512,5 样本并将其保存在新数组中来实现此目的。但通过取前 5512 个样本的平均值,将新数组的 1 保存到位。然后取样本 5513-11024 的平均值,并将其保存在新数组的位置 2 中。依此类推...并取样本 11025 到 11025+5512 并将其平均值放在数组的第 3 处。
我知道它必须是某种双 for 循环,但我只是不知道如何......有什么帮助吗?
EDIT:
以非常手动的方式完成我正在寻找的代码。
` fs=44100;
fo=8;
A = randn(44100,1); %array 使用随机数据在 fs=44100 处采样
A_resampled = zeros(numel(A)/5512);
first_block = zeros(5512,1);
for i = 1:length(first_block)
first_block(i) = A(i);
end
first_mean_value = mean(first_block);
A_resampled(1) = first_mean_value;
second_block = zeros(5512,1);
for k = 5513:5512+length(second_block)
second_block(k) = A(k);
end
second_mean_value = mean(second_block);
A_resampled(2) = second_mean_value;`
等等...
怎么样使用accumarray http://es.mathworks.com/help/matlab/ref/accumarray.html? Let x
表示您的输入向量。然后
n = ceil((1:numel(x))/5512.5); %// blocks of 5512, 5513, 5512, 5513... samples
result = accumarray(n(:), x (:), [], @mean);
注意n
自动定义块大小不等,最多相差一个样本,以匹配您的目标块大小的分数。在您的示例中,块大小是5512
, 5513
, 5512
, 5513
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)