Распределенно «сбрасывать» / «сжимать» образцы данных - PullRequest
2 голосов
/ 18 января 2012

Я не совсем уверен, какое название подходит для моего вопроса Итак, вот вопрос Предположим, у меня есть N образцов, например: 1 2 3 4 , , , N

Теперь я хочу «уменьшить» размер выборки с N до M путем сброса (N-M) данных из N выборок. Я хочу, чтобы сброс был как можно более "распределенным", Например, если у меня есть 100 сэмплов и я хочу сжать их до 50, я бы выбрасывал все остальные сэмплы. Другой пример, скажем, данные представляют собой 100 выборок, и я хочу сжать их до 25 выборок. Я бы выбрасывал 1 образец в каждой группе из 100/25 образцов, что означает, что я перебираю каждый образец и счет, и каждый раз, когда мой счет достигает 4, я выбрасываю образец и перезапускаю счет. Проблема в том, как мне сделать это, если 4 выше должно быть, например, 2.333. Как мне обработать десятичную точку, чтобы распределить выборку?

Большое спасибо ..

Ответы [ 3 ]

3 голосов
/ 18 января 2012

Вы ищете следующие термины: повторная выборка , понижающая выборка и десятичная дробь .Обратите внимание, что в общем случае вы не можете просто отбросить подмножество ваших данных, не рискуя алиасинг .Вам нужно фильтр нижних частот ваши данные в первую очередь, перед децимацией, чтобы над вашей новой скоростью Найквиста не было информации, которая была бы псевдонимом.

Когда выесли вы хотите уменьшить частоту дискретизации по нецелочисленному значению, например, 2.333, как в приведенном выше примере, вы обычно делаете это путем повышения дискретизации с помощью целочисленного коэффициента M, а затем понижающей дискретизации с помощью другого целочисленного коэффициента N, где дробь M/N дает требуемую повторную выборкуфактор.В вашем примере M = 3 и N = 7, так что вы будете повышать в 3 раза, а затем уменьшать в 7 раз.

0 голосов
/ 19 января 2012

Для аудиоданных, которые вы хотите звучать достойно (в отличие от псевдонимов и искажений в частотной области), см. Ответ Пола Р., включающий повторную выборку. Одним из методов передискретизации является интерполяция, например, использование ядра интерполяции Windowed-Sinc, которое будет правильно фильтровать данные нижних частот, а также позволит создавать интерполированные промежуточные значения.

Для несэмплированных и не аудио данных, когда вы просто хотите отбросить некоторые семплы почти равномерно распределенным образом, и вам не нужно добавлять шум и искажения в частотной области, что-то подобное может сработать :

float myRatio = (float)(N-1) / (float)(M-1);  // check to make sure M > 1 beforehand
for (int i=0; i < M; i++) {
  int j = (int)roundf(myRatio * (float)i);  // nearest bin decimation
  myNewArrayLengthM[i] = myOldArrayLengthN[j];
}
0 голосов
/ 18 января 2012
  1. Похоже, вы говорите о частотах дискретизации и цифровой обработке сигналов
  2. Перед сокращением вы обычно фильтруете данные, чтобы убедиться, что высокие частоты в вашей выборке не совмещены с более низкими частотами.Например, в вашем (принять каждое четвертое значение) частота, которая повторяется каждые четыре выборки, будет иметь псевдоним "DC" или частоту нулевого цикла (например, "234123412341", начиная с первой из каждой группировки, получит "2,2", 2,2 ", что может быть не тем, что вы хотите. (3 цикла также будут псевдонимом цикла, подобного самому себе (231231231231) => 231 ... (если я не сделал этого неправильно, потому что устал).немного больше того, что я хотел бы обсудить прямо сейчас, поскольку это довольно сложная тема.
  3. Если вы можете представить свой «2.333» в виде некоторой дроби, давайте посмотрим, это 7/3. Вы говорили 1из каждых 4 сэмплов (1/4) я бы сказал, что вы берете 3 из 7 сэмплов, так что вы можете (взять, уронить, взять, уронить, взять, уронить, уронить), но могут быть и другие методы.
...