Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Подсчёт ипульсов


Автор: m31 20.11.2008, 12:13
Со звуковой карты считывается входящий сигнал. Пока я данные записываю просто в файл и параллельно строю график. На графике выходит вот такая вот картинка:
user posted image
У меня сейчас возникла проблема, а как подсчитать количество этих импульсов за какой-то определённый промежуток времени... например считать через каждые 1с?
Кто что может посоветовать? 

Автор: xvr 20.11.2008, 16:01
Цитата(m31 @ 20.11.2008,  12:13)
Со звуковой карты считывается входящий сигнал. Пока я данные записываю просто в файл и параллельно строю график. На графике выходит вот такая вот картинка:
user posted image
У меня сейчас возникла проблема, а как подсчитать количество этих импульсов за какой-то определённый промежуток времени... например считать через каждые 1с?
Кто что может посоветовать?

Можно посоветовать брать и считать  smile Можно поточнее об импульсах :
  •  Средняя линия - это 0 или нечто большее (импульсы однополярные или биполярные)?
  •  Амплитуда импульсов может менятся или она более менее фиксированна?
  •  Длительность и частота импульсов может менятся или она более менее фиксированна?
В общем можно пропустить импульсы через програмный компаратор с гистерезисом и посчитать количество переходов 0->1 на его выходе за 1с. (1с - это F отсчетов, где F - частота дискретизации в герцах)

Автор: m31 20.11.2008, 18:41
Цитата(xvr @  20.11.2008,  16:01 Найти цитируемый пост)
 Средняя линия - это 0 или нечто большее (импульсы однополярные или биполярные)?

Линия по центру это чуть ниже 0, но думаю на ноль удасца вывести, но пока оно ниже...

Цитата(xvr @  20.11.2008,  16:01 Найти цитируемый пост)
 Амплитуда импульсов может менятся или она более менее фиксированна?

может меняться(

Цитата(xvr @  20.11.2008,  16:01 Найти цитируемый пост)
 Длительность и частота импульсов может менятся или она более менее фиксированна?

частота со временем может изменяться...

Автор: xvr 20.11.2008, 20:27
Цитата(m31 @ 20.11.2008,  18:41)
Цитата(xvr @  20.11.2008,  16:01 Найти цитируемый пост)
 Средняя линия - это 0 или нечто большее (импульсы однополярные или биполярные)?

Линия по центру это чуть ниже 0, но думаю на ноль удасца вывести, но пока оно ниже...

Цитата(xvr @  20.11.2008,  16:01 Найти цитируемый пост)
 Амплитуда импульсов может менятся или она более менее фиксированна?

может меняться(

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

Автор: m31 20.11.2008, 20:34
Цитата(xvr @  20.11.2008,  20:27 Найти цитируемый пост)
Если есть гарантированная минимальная амплитуда положительных и отрицательных импульсов - то компаратор с гистерезисом проблему решит, если нет - то придется делать более сложный анализ

в принципе можно попробовать сделать гарантированную, но она всёравно чего-то синусоидальную форму имеет при большой частоте импульсов(это я об амплитуде положительных и отрицательных импульсов ). Если даже присмотреться, на рисунке что я показал, уже видно...
Что можешь посоветовать? как читать куда копать? 

Автор: xvr 21.11.2008, 12:55
Цитата(m31 @ 20.11.2008,  20:34)
Цитата(xvr @  20.11.2008,  20:27 Найти цитируемый пост)
Если есть гарантированная минимальная амплитуда положительных и отрицательных импульсов - то компаратор с гистерезисом проблему решит, если нет - то придется делать более сложный анализ

в принципе можно попробовать сделать гарантированную, но она всёравно чего-то синусоидальную форму имеет при большой частоте импульсов(это я об амплитуде положительных и отрицательных импульсов ). Если даже присмотреться, на рисунке что я показал, уже видно...
Что можешь посоветовать? как читать куда копать?

Главное, что бы были 2 гарантированных порога (по амплитуде), тогда можно сделать приблизительно так:
Код

int state=-1;
int pulse_count=0;
int total_count=0;

const int LoLimit = -100; // Нижний порог
const int HiLimit = 100; // Верхний порог
const int SamplFreq = 44000; // Частота дискретизации

// Через эту процедуру будет происходить вывод результатов
extern void SendPulseCount(int pulse_count_for_1sec);

// Процедуру add_sample вызывать для каждого отсчета с звуковой карты
void add_sample(int value)
{
 bool prev_is_0 = (state==0);
 if (val<LoLimit) state=0; else
 if (val>HiLimit) state=1;
 ++total_count;
 if (prev_is_0 && state==1) ++pulse_count;
 if (total_count>=SamplFreq)
  {
   SendPulseCount(pulse_count);
   total_count=pulse_count=0;
  }
}

Автор: J0ker 21.11.2008, 18:54
если нужна частота то лучше пойти по пути математики и использовать быстрое преобразование Фурье

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)