我正在尝试检测高振幅事件,并将它们与上下几行一起移除。我有下面的代码,它部分地实现了这一点,但不是完全的,我不确定错误在哪里。我已经注解掉了Audioread功能,并添加了Randi以允许重现结果。代码:
%[data, fs] = audioread("noise.wav");
%t1 = linspace(0, (numel(data)-1)/fs, numel(data));
rng(1)
data = randi(10,1000,1);
threshold = 5;
clear_range = 10; %rows/samples
data = clearRange(data, threshold, clear_range);
%t1 = linspace(0, (numel(data)-1)/fs, numel(data));
%plot(t1, data);
plot(data)
function [data] = clearRange(data, threshold, clear_range, compare_column)
% data: matrix of values to clean
% threshold: value to compare values against
% clear_range: number of rows to delete
% compare_column: column to check for value to compare against threshold
if nargin < 4
compare_column = 1;
end
for i = 1:length(data)
if i > length(data)
break
end
if data(i,compare_column) > threshold
data(max(1, i-clear_range):min(length(data), i+clear_range),:) = [];
end
end
end
1条答案
按热度按时间vxbzzdmp1#
我认为您的代码的主要问题是在循环
data
时修改它。这意味着,您删除了索引大于i
的行中的峰值(或您的话中的高幅度事件),以便在后续迭代中不会考虑它们。例如,考虑索引为
4
和6
的行中的峰值,这应该会导致移除直到索引16
的行(其值为clear_range equal
到10
)。但是,当i
等于4
时,将删除索引14
以下的行。因此,您还删除了位置6
处的峰值,以便在以后的迭代中不会将其考虑在内。一般而言,依赖于MatLab的矩阵/数组运算比使用循环更容易。请在下面找到一个可能的解决方案,并在线解释。