НОВЫЙ ОТВЕТ:
Исходя из вашего графика отсортированных амплитуд, ваш алгоритм diff(sort(V))
, вероятно, будет работать хорошо. Вам просто нужно будет выбрать порог для того, что составляет «слишком большую» разницу между отсортированными значениями. Первая точка в вашем векторе diff(sort(V))
, которая превышает этот порог, затем используется для получения порога, используемого для V
. Например:
diffThreshold = 2e5;
sortedVector = sort(V);
index = find(diff(sortedVector) > diffThreshold,1,'first');
signalThreshold = sortedVector(index);
Другая альтернатива, если вы заинтересованы в том, чтобы играть с ней, - это скопировать ваши данные, используя HISTC . В конечном итоге вы получите группы густонаселенных контейнеров с низкой и высокой амплитудой, а между ними - малонаселенные. В этом случае необходимо решить, какие ячейки считаются частью группы с низкой амплитудой (например, первая группа ячеек, содержащая как минимум X отсчетов). Например:
binEdges = min(V):1e7:max(V); % Create vector of bin edges
n = histc(V,binEdges); % Bin amplitude data
binThreshold = 100; % Pick threshold for number of elements in bin
index = find(n < binThreshold,1,'first'); % Find first bin whose count is low
signalThreshold = binEdges(index);
СТАРЫЙ ОТВЕТ (для потомков):
Нахождение «разумного максимального элемента» полностью зависит от вашего определения разумного . Существует множество способов определить точку как выброс , например, просто выбрать набор порогов и игнорировать все, что находится за пределами того, что вы определяете как «разумный». Предполагая, что ваши данные имеют нормальное распределение, вы можете использовать простой подход, основанный на данных, для удаления выбросов из вектора V
с использованием функций MEAN и STD :
nDevs = 2; % The number of standard deviations to use as a threshold
index = abs(V-mean(V)) <= nDevs*std(V); % Index of "reasonable" values
maxValue = max(V(index)); % Maximum of "reasonable" values