Как осуществить очистку синусоиды сигнала после приема?
Излучатель генерирует постоянный синусовый сигнал с частотой 100 герц, без модуляции по амплитуде. Приемник принимает этот сигнал, на входе получается синус с разной амплитудой для каждого пика. Появляется, грубо говоря, амплитудная модуляция у сигнала. Появляется такой эффект из-за среды, по которой проходит сигнал. Цель - как раз измерить параметры среды по изменениям амплитуды.
АЦП 10 бит сливает данные сразу на компьютер по com порту. Обработка - на компе, на языке с++. За входящий сигнал в каждый отсчет времени принимаю S(t). Период измерений АЦП - 100 микросекунд, получается АЦП проводит считывание с частотой 10khz, делая на один период синусоиды 100 измерений.
После прочтения некоторой литературы, у меня сложилось в голове две схемы: Путь "а":
1) Провести квадратурное разложение на I и Q, грубо говоря: I(t) = cos(f(t))*S(t), Q(t) = -sin(f(t))*S(t). Где f(t) за те-же самые 1 мс проходит от 0 до 2*PI, или, по-другому, гетеродин при разложении работает с частотой несущей
2) Производим выборку одновременно из I и Q, уменьшая частоту сигнала в 4 раза, до 2500 герц, используя CIC фильтр в режиме выборки.
3) Используем FIR фильтр к получившимся из пункта 2 сигналам I и Q, обрезая ненужные частоты.
4) Считаем результирующий сигнал, используя формулу R(t') = sqrt(I(t')^2+Q(t')^2).
4) Для измерения амплитуды, ищем разность максимума и минимума результирующего набора данных. Грубо говоря, этот набор - значения той-же синусоиды из передатчика с измененной амплитудой, но только точек измерения больше и они точнее, так?
Путь "б":
1) Провести квадратурное разложение на I и Q, но генератор угла при разложении работает с частотой несущей * 10, например - 100khz.
2) Производим выборку одновременно из I и Q, уменьшая частоту сигнала в 4 раза, до 25khz, используя CIC фильтр в режиме выборки.
3) Используем FIR фильтр к получившимся из пункта 2 сигналам I и Q, обрезая ненужные частоты.
4) Считаем результирующий сигнал, используя формулу R(t') = sqrt(I(t')^2+Q(t')^2).
4) Аналогично ищем нужную амплитуду по скорректированному сигналу.
Или я вообще ничего не понял и действовать необходимо по-другому?
Не вполне понял цель задачи и условия.
Как я понял условия:
есть некий генератор гармонического сигнала,
есть некий детектор (на каком принципе построен?),
есть набор отсчетов с АЦП после детектора (Fд = 100Fmax),
есть паразитная АМ сигнала, обусловленная динамическим изменением параметров среды.
Как я понял цель:
требуется косвенно оценить параметры среды передачи по изменению амплитуды принятого сигнала.
Чего не хватает в условиях:
- имеются ли сведения об амплитуде исходного сигнала при детектировании,
- с какой частотой происходят изменения среды передачи (накопление да/нет),
- имеется ли возможность калибровки детектора по приему при некоторых известных параметрах среды.
Как-то так...
З.Ы. Нашел, что мне подойдет вейвлет фильтр. Сейчас внедряю в код, отпишусь о результатах.
Детектор - на фотодиодах и ОУ.
Амплитуда исходного сигнала известна, в понимании АЦП - соответствует 5 вольтам.
Среда изменяется таким образом, что на 50 отсчетов может произойти спад амплитуды до минимальных значений. Это экстремальный вариант.
Вариант каллибровки имеется.
Если есть вариант начальной калибровки и если я правильно понял все условия, то я рекомендовал бы не заморачиваться, а тупо брать N отсчетов, сравнивать их с данными калибровки, разницу аппроксимировать кубическими сплайнами, делать обрезку (выкидывать недостоверные "края"), а дальше - брать производные, по ним уже судить о скорости и "направлении" изменений среды.
Вейвлет фильтр поможет вам избавиться от паразитной АМ, да. Но зачем, если вы итак знаете исходный сигнал?
В общем, как я делал.
Т.к. железо везде слабое, то в Arduino использую скользящую среднюю по 3 для результатов пиков, а на входе использовал простой lowpass фильтр. Для ускорения писал на Atmel библиотеках, а не на Arduino. Так объем кода вырос, но итоговый файл сократился и стал быстрее работать.
uint16_t lowpass(uint16_t prev, uint16_t cur, float a)
{
return prev + a * (cur*1.0 - prev*1.0);
}
Т.к. при частоте 100 герц, на один пик приходилось 4-5 измерений, то не было нужды искать пики сложно, искал просто как минимум - максимум из 3.
Получившуюся амплитуду фильтровал также sma по 3. И отправлял в COM порт сразу 3 значения.