Извлечь определенное количество образцов слева направо в заданную точку индекса сигнала в Matlab - PullRequest
0 голосов
/ 21 мая 2019

Имеется матрица Idx = [1xM] с размером М индексных номеров извлекаемого сигнала. Для каждого номера индекса слева направо должны быть извлечены определенные количества выборок, чтобы сформировать новый суб-сигнал исходного сигнала. Например, 3 выборки слева и 4 выборки справа от номера индекса см. Ниже:

[idx-3:idx+4]

[New_Sig] становится однорядной матрицей вместо того, чтобы быть тем же самым измерением номера индекса от индексной матрицы [Idx]

Fs = 500; %Frequency:500
StartIdx = 0.150 * Fs;
EndIdx = 0.500 * Fs;

[Idx] = [.....];
[New_Sig] = [Idx-StartIdx : Idx+EndIdx];

Вот пример для двух индексных точек из Idx матрицы ниже:

[Idx] = [2 19 23 43 48 52 62 74 78 79 81]
old_sig = [-2 0 1 2 5 6 7 8 10 19 20 21 22 23 24 25 ...]

if # of sample from left = 3, # of sample from right = 4:

a_new_sub = [-2 0 1 **2** 5 6 7 8]
b_new_sub = [7 8 10 **19** 20 21 22 23]
.....

1 Ответ

2 голосов
/ 21 мая 2019

Вот мое предложение для решения этой проблемы:

StartIdx = 3;
EndIdx = 4;

Idx = [2 19 23];
old_sig = [-2 0 1 2 5 6 7 8 10 19 20 21 22 23 24 25 26 27 28 29];

% Get number of "indices".
nIdx = numel(Idx);

% Find actual indices.
idx = ceil(find(repmat(old_sig, nIdx, 1) == repmat(Idx', 1, numel(old_sig))) / nIdx);

% Set up correct (index) ranges to access in old_sig.
idx = repmat(-StartIdx:EndIdx, nIdx, 1) + repmat(idx, 1, (StartIdx + EndIdx + 1));

% Determine output.
new_sig = old_sig(idx)

В качестве вывода получаем:

new_sig =
   -2    0    1    2    5    6    7    8
    7    8   10   19   20   21   22   23
   20   21   22   23   24   25   26   27

Предостережение: на данный момент ваш old_sig содержит уникальные значения. Следовательно, find найдет правильный (уникальный) индекс. Если значения в вашем сигнале повторяются, необходимо указать, какое значение должно быть найдено.

Еще одна оговорка: в зависимости от того, насколько велик ваш сигнал old_sig и сколько у вас индексов в Idx, этот подход может потребовать большого объема памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...