Сортировка измерений ацп

Алгоритм сортировки, имеем сигнала ацп в 10 периодов по 256 измерений на период - Buffer_ADC[5120], в буфере данные с двух разных ацп чередуются, с ацп1 нечетные, с ацп2 четные. Нужно рассортировать по числу периодов и двум разным буферам для каждого ацп. На выходе у меня данные немного плящут постоянно, т.е в буфере Buffer_ADC[5120] я имею нормальные данные снятые ацп, а после сортировки Ггг… Что не так делаю

			#define BUFFER_SIZE 512U
			#defien N_PERIOD 10
			
			for (uint16_t i = 0; i < (BUFFER_SIZE*N_PERIOD)-1; i++, cnt_sample++)
			{
				//Считаем число выборок в периоде
				if (cnt_sample > (BUFFER_SIZE-1) { 
					cnt_sample = 0;
					cnt_period++; 
				}

				uint16_t j = i / 2;
				//четность массива
				if (i % 2 == 0) 
				{
					BufIn[cnt_period][j] = Buffer_ADC[i];
				}
				else
				{
					BufIn2[cnt_period][j] = Buffer_ADC[i];
				}
			}

Выложите полный код копипастом, чтобы не было бреда, типа defien в строке №2

На всякий случай, если выше было непонятно:

полный код копипастом

Чередуются как? Каждое измерение или период? И сколько байт возвращает измерение?

Апц 12бит
Чередование каждое измерение, т.е. на период у нас будет 256 измерений каждого ацп, и в буфере будет 512 значений.

Еще раз (для тех, кто в танке): Одно измерение сколько байт?

	for (uint16_t i = 0; i < (BUFFER_SIZE/2); i++)
	{
		BufIn[i] = Buffer_ADC[i*2];
		BufIn2[i] = Buffer_ADC[i*2+1];
	}
1 лайк

2 байта

а почему мы проходимся только по половине BUFFER_SIZE/2 , остальное что не важно,?

Мы проходим по всему буферу, на за раз считываем два отсчета.

А можно и не плодить массивов. Нацеливаем указатель со смещением.

uin16_t* ptr=buffer_ADC+1;
uint16_t A1=Buffer_Adc[5];//читаем Ацп1 отсчёт 5
uint16_t A2=ptr[10];// ацп2 отсчёт 10
1 лайк

andriano, te238s спасибо за примеры. хочу спросить в моем то коде что не так? для усвоения

Много непонятных действий. К какому формату привести надо? Чётные в один, нечётные во второй? Смущает фраза “рассортировать по числу периодов”. В Вашем коде никакой сортировки и почему-то массивы двумерные.
Как говорит @ЕвгенийП , код полный дайте и ещё раз более развёрнуто о целях кода.

а что тут может быть не понятного… к примеру 10 периодов оцифровали в Buffer_ADC, дальше раскидываю. К примеру частота 100Гц, выборки с частотой 25600Гц, получится равно 256 на период 100Гц и так 10 раз. Но ацп у нас два, работают они парно, поэтому значения сваливаются в Buffer_ADC следующим образом апц1 ацп2, ацп1 ацп2 ит.д. каждый период будет содержать в Buffer_ADC 512 значений, из них для каждого апц по 256.
1 период в нем 256 значений:
ВufIn[0][0] = 4095, BufIn[0][2] = 4093, BufIn[0][4] = 4093 … BufIn[0][255] = 4094
а BufIn2[0][1] = 1302, BufIn2[0][3] = 1304, BufIn2[0][5] = 1305 … BufIn2[0][255] = 1031
аналогично дальше следующие периоды
какой еще код полный, все что дал то и есть! InitADC(), DMA() и прочая перефирийка? для чего? уйдет тема не понятно куда…

Почему бы не объявить указатель на массив 2х(5120/2) и присвоить ему адрес Buffer_ADC. Ничего сортиравать не нужно. Сразу можно получить значение нужного ADC по первому индексу.

Загадочный код))
Вроде всё написано правильно, ( стр.4
(BUFFER_SIZE*N_PERIOD)-1; -1 лишнее), но не работает.
А как проверяете?

Вот, написал сокращённый вариант, и он заработал, лишь когда закомментировал стр.17 - 21

Спойлер
#define BUFFER_SIZE 4
#define N_PERIOD 4
uint16_t Buffer_ADC[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
uint16_t BufIn[2][4];
uint16_t BufIn2[2][4];
uint16_t cnt_sample = 0;
uint16_t cnt_period = 0;

void setup()
{
  Serial.begin(9600);
  delay(300);

  for (uint16_t i = 0; i < (BUFFER_SIZE * N_PERIOD); i++, cnt_sample++)
  {
    /* //Считаем число выборок в периоде
      if (cnt_sample > (BUFFER_SIZE - 1)) {
       cnt_sample = 0;
       cnt_period++;

      }
    */

    uint16_t j = i / 2;


    //четность массива
    if (i % 2 == 0)
    {
      BufIn[cnt_period][j] = Buffer_ADC[i];
    }
    else
    {
      BufIn2[cnt_period][j] = Buffer_ADC[i];
    }

  }
  Serial.print(BufIn[0][0]);
  Serial.print(" ");
  Serial.print(BufIn[0][1]);
  Serial.print(" ");
  Serial.print(BufIn[0][2]);
  Serial.print(" ");
  Serial.print(BufIn[0][3]);
  Serial.println();
  Serial.print(BufIn[1][0]);
  Serial.print(" ");
  Serial.print(BufIn[1][1]);
  Serial.print(" ");
  Serial.print(BufIn[1][2]);
  Serial.print(" ");
  Serial.print(BufIn[1][3]);
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.print(BufIn2[0][0]);
  Serial.print(" ");
  Serial.print(BufIn2[0][1]);
  Serial.print(" ");
  Serial.print(BufIn2[0][2]);
  Serial.print(" ");
  Serial.print(BufIn2[0][3]);
  Serial.println();
  Serial.print(BufIn2[1][0]);
  Serial.print(" ");
  Serial.print(BufIn2[1][1]);
  Serial.print(" ");
  Serial.print(BufIn2[1][2]);
  Serial.print(" ");
  Serial.print(BufIn2[1][3]);


  Serial.println();

}

void loop() {

}

Что очень странно.
Жаль уже нет времени, если что ещё позже гляну

Спойлер

Screenshot_73

1 лайк

Тогда всё просто - это не компилируется.

Такой, какой я мог бы взять и запустить у себя ничего не добавляя и не придумывая.

Нахрена мне это? Проблема в сортировке? Вот и напишите полный код сортировки и по нему будем работать.

Я не знаю, для чего Вам это. Вам виднее.

Вашего кода мы не видели. То, что видим - не компилируется. Это (некомпилируемость) достаточно “не так”?

Я понял вас, вы не обижайтесь! пишу я для stm32f303 в visualgdb, и не знал как вы сможете у себя запустить.

в отладчике на железе попрбовал

Хотя бы банально ошиблись с типом буфера и всё. Нам то неведомо. Не видим объявлений переменных.
А точно есть нужда в 2 дополнительных массивах? Они не обеспечат увеличения скорости.

1 лайк

Очевидно, что не правильно вычисляется cnt_period

P.S. Попробуйте закомментировать те же строки, что и я, массив должен последовательно заполниться, как одномерный

1 лайк