|
Цифровая обработка низкочастотного аналогового сигнала, Полезный сигал ниже 50 Гц |
|
|
|
Apr 11 2013, 08:47
|

пуля
   
Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959

|
Добрый день! Есть задача: необходимо определить наличие сигнала (синусоида) конкретной частоты (заранее известной, скажем 25 Гц) на предмет её наличия. Диапазон от 10-30 Гц. Сигнал слабый, и при этом "перемешен" с 50 Гц (наводки/помехи). Сигнал имеет паузы: 1 секунду сигнал есть, 2 сек. нет. Ранее в проекте закладывали oversampling. Но практической пользы я пока не нашел. Может кто нить подсказать, что даёт этот метод, и как им пользоваться. Исходные данные: 1) необходимо детектировать (сказать что сигнал такой то частоты присутствует!) сигнал частотой скажем 25Гц 2) частота дискретизации порядка 10500 Гц. 3) устройство микропроцессорное, т.е. все фильтры должны быть подсилу мк. Пример сигнала на рисунке:
А может сигнал быть по уровню с помехой, а то и меньше! Что необходимо сделать? Заранее огромное спасибо!
|
|
|
|
Guest_TSerg_*
|
Apr 11 2013, 22:16
|
Guests

|
Начните с изучения помеховой обстановки. Все остальное - потом.
|
|
|
|
|
Apr 13 2013, 22:05
|
Местный
  
Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163

|
Хороший режекторный фильтр можно сделать используя comb filter и правильно подгадав частоту дисретизации, чтобы минимум комба попал как раз на частоту, которую нужно давить (ну т.е. она должна быть кратной тому, что давите). Получается дешево и сердито. Он же успешно задавит гармоники помехи. Вобщем, ключевые слова для гугла - comb notch filter PS результаты синтеза можно увидеть здесь
Сообщение отредактировал andyp - Apr 13 2013, 22:13
|
|
|
|
|
Apr 16 2013, 02:16
|
Местный
  
Группа: Участник
Сообщений: 200
Регистрация: 30-10-10
Пользователь №: 60 531

|
Цитата(bullit @ Apr 11 2013, 11:47)  Ранее в проекте закладывали oversampling. Но практической пользы я пока не нашел. видимо неправильно закладывали. Должно помогать. Смотрю у вас частота дискретизации 10500Гц, а хотите померять 10-30Гц, вот вам и оверсэмплинг. Осталось сделать downsampling и вытащить низкие частоты вверх. Советую записать ваш сигнал в WAV-файл, открыть звуковой редактор Audacity, после загрузки файла выбрать режим отображения Spectrogram вместо Waveform. Затем Effect -> Change Speed -> 200%, потом ещё раз и ещё и смотрите на спектре, появляются ли ваши частоты. Появиться они дожны соответсвтенно выше, чем на 10-30Гц, в зависимости от того, насколько вы ускорили запись в Change Speed. Если что-то увидите, есть смысл делать алгоритм. Вот нетребовательный к памяти метод: Цитата Code : //Filtres décimateurs // T.Rochebois // Based on //Traitement numérique du signal, 5eme edition, M Bellanger, Masson pp. 339-346 class Decimateur5 { private: float R1,R2,R3,R4,R5; const float h0; const float h1; const float h3; const float h5; public: Decimateur5::Decimateur5():h0(346/692.0f),h1(208/692.0f),h3(-44/692.0f),h5(9/692.0f) { R1=R2=R3=R4=R5=0.0f; } float Calc(const float x0,const float x1) { float h5x0=h5*x0; float h3x0=h3*x0; float h1x0=h1*x0; float R6=R5+h5x0; R5=R4+h3x0; R4=R3+h1x0; R3=R2+h1x0+h0*x1; R2=R1+h3x0; R1=h5x0; return R6; } }; отсюда, есть на девять точек http://www.musicdsp.org/archive.php?classid=3#231Легко переделывается для многокаскадности, в 2-4-8-16 и т.д. раз, место нужно только под переменные h,R каждого из каскадов. Я цеплял 8-каратную децимацию прямо на прерывание АЦП, работало очень хорошо и быстро, без всяких простоев в фоновом режиме. Если ничего не получается, выложите WAV-файл, может появятся идеи.
|
|
|
|
|
Apr 18 2013, 16:57
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 28-05-12
Пользователь №: 72 050

|
Цитата(bullit @ Apr 11 2013, 12:47)  Добрый день! Есть задача: необходимо определить наличие сигнала (синусоида) конкретной частоты (заранее известной, скажем 25 Гц) на предмет её наличия. Диапазон от 10-30 Гц. Сигнал слабый, и при этом "перемешен" с 50 Гц (наводки/помехи). Сигнал имеет паузы: 1 секунду сигнал есть, 2 сек. нет. Ранее в проекте закладывали oversampling. Но практической пользы я пока не нашел. Может кто нить подсказать, что даёт этот метод, и как им пользоваться. Исходные данные: 1) необходимо детектировать (сказать что сигнал такой то частоты присутствует!) сигнал частотой скажем 25Гц 2) частота дискретизации порядка 10500 Гц. 3) устройство микропроцессорное, т.е. все фильтры должны быть подсилу мк. Пример сигнала на рисунке:
А может сигнал быть по уровню с помехой, а то и меньше! Что необходимо сделать? Заранее огромное спасибо! Я с помощя корреляции идентицировал частоты АОН, DTMF и ответ станции. Атмеловский мк ATmega8 работаящий с кварцем 16МГц успевал. Чтобы ускорить расчеты пользовался таблией заранее расчитанных значений синусов(256 значений). Но от аналогового (или на переклячаемых конденсаторах)фильтра на входе АЦП вам наверное не уйти. После фильтрации можно взять частоту дискретизации намного раз меньше(зависит от частоты среза) и ваш oversampling станет ненужным.
|
|
|
|
|
Apr 21 2013, 21:22
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
так чем Герцель-то не угодил? test.lua: Код file = io.open("test26.txt") f = 22 fs = 10416 coeff = 2 * math.cos(2 * 3.1415926535 * f / fs) s = 0 sprev = 0 sprev2 = 0 Kt = 0.995
for data in file:lines("*n") do s = s + ((data + coeff * sprev - sprev2) - s) * Kt sprev2 = sprev sprev = s power = sprev2 * sprev2 + sprev * sprev - coeff * sprev * sprev2 print(power * 1e-9) end file:close() lua52 test.lua > out gnuplot -e "plot 'out' with lines, 'test26.txt' with lines" -
|
|
|
|
|
Apr 22 2013, 08:07
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(bullit @ Apr 22 2013, 12:38)  А правильно ли я понимаю что строка "s = s + ((data + coeff * sprev - sprev2) - s) * Kt" это окно? А имеет ли смысл "ставить" цифровой фильтр предварительно? Ведь сам алгоритм и есть фильтр! это что-то вроде окна, сделанное простым БИХ фильтром. то есть по идее, наверное, надо было просто посчитать производную от power и опять отфильтровать. что примерно данный фильтр и делает. предварительно фильтр не особо поможет, т.к. герцель это просто преобразование Фурье для заданной частоты т.е. лучше уже не будет. разве что для децимации, чтобы не тащить такой поток данных, но так как данный Герцель будет делаться быстрее чем нормальный ФНЧ для децимации, то пожалуй это бесполезно, а то и хуже сделает.
|
|
|
|
|
Aug 1 2013, 04:09
|
Частый гость
 
Группа: Участник
Сообщений: 100
Регистрация: 20-05-10
Из: Omsk
Пользователь №: 57 391

|
Цитата(bullit @ Apr 13 2013, 16:23)  ФНЧ? эт чтоб срез на 30 Гц и уже на 50 Гц порядка -40-60 дБ? Не подскажите какой цифровой фильтр взять? Если нет необходимости в определении точного значения амплитуды сигнала (частота точно неизвестна) можно применить очень простой КИХ фильтр (на основе циклотомических полиномов с единичными коэффициентами) который бедет давить сетевую помеху и ее гармоники на указанные величины. Где-то ранее расчет такого фильтра я здесь приводил. Частота дискретизации 600 Гц.
|
|
|
|
|
Aug 4 2013, 09:46
|

пуля
   
Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959

|
В том то и дело, что не знаю где шум, а где сигнал! Я могу подсчитать хоть средне, хоть среднеквадратичное, но только всего сигнала, ну т.е. какого-то интервала. Но я не знаю где шум, а где сигнал. тут получается замкнутый круг)) Объясню чуть подробней: вот есть сигнал, как на картинке в вашем посте 28. Визуально я могу выделить сигнал и шум, а как программно - не знаю как подобрать нормальный алгоритм. К сожалению от алгоритма герцеля пришлось отказаться, так как ооочень много шума, пришлось ставить ПФ порядком выше. Хотя может после ПФ герцеля поставить? Да еще чтоб при отсутствии сигнала, не ловить на уровне шума ложные срабатывания. Мне кажется нужно использовать то, что отличает шум от сигнала: 1) это уровень 2) гармоничность 3) длительность Сейчас вот есть такой алгоритм: 1) провожу подсчет среднего за N точек (синий на графике) (1/N кратен (частота сэмплов/частота искомого сигнала)) - по-моему это децимация называется? поправьте если ошибаюсь. 2) отрицательные значения умножаем на -1 2) считаем среднее за интервал длительности сигнала Получаем что-то подобное:
Критерий: сигнал выше среднего 60-80 % времени - но критерий какой-то странный))
|
|
|
|
|
Aug 4 2013, 12:39
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(bullit @ Aug 4 2013, 15:46)  В том то и дело, что не знаю где шум, а где сигнал! Я могу подсчитать хоть средне, хоть среднеквадратичное, но только всего сигнала, ну т.е. какого-то интервала. Но я не знаю где шум, а где сигнал. тут получается замкнутый круг)) когда уровень вдруг становится больше чем 3 (или больше) сигма, скорее всего (99.7%) это уже не шум а сигнал, и считать среднеквадратичное значение шума надо прекратить. Цитата(bullit @ Aug 4 2013, 15:46)  К сожалению от алгоритма герцеля пришлось отказаться, так как ооочень много шума, пришлось ставить ПФ порядком выше. Хотя может после ПФ герцеля поставить? что-то мне подсказывает что интеграл Фурье на заданной частоте это оптимальный полосовой фильтр, Цитата(bullit @ Aug 4 2013, 15:46)  Сейчас вот есть такой алгоритм: 1) провожу подсчет среднего за N точек (синий на графике) (1/N кратен (частота сэмплов/частота искомого сигнала)) - по-моему это децимация называется? поправьте если ошибаюсь. 2) отрицательные значения умножаем на -1 2) считаем среднее за интервал длительности сигнала Получаем что-то подобное:
Критерий: сигнал выше среднего 60-80 % времени - но критерий какой-то странный)) если уровень меньше чем k * sigma (k=3 например) считаем среднеквадратичное значение дальше, если нет, то это сигнал и не обновляем среднеквадратичное значение. причём чтобы не хранить кольцевой буфер для честного вычисления среднего и среднеквадратичного значений, можно считать немного проще: Y0 += (x - Y0) / N; Y2 += (x - Y0)^2 / N; stDev = sqrt(Y2);
|
|
|
|
|
Aug 4 2013, 18:40
|

пуля
   
Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959

|
Растёт, только с большей скоростью) Я так понимаю N это всё таки константа? И судя по всему это нечто иное чем RMS, не? Тем более, если N не константа. Поправьте если я ошибаюсь!
|
|
|
|
|
Aug 4 2013, 19:08
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(bullit @ Aug 5 2013, 01:40)  И судя по всему это нечто иное чем RMS, не? N - константа времени. и да, по ссылке правильно. а это просто замена честного усреднения БИХ фильтром. разница лишь в том что если считать честно не с начала до конца, а только за последние n отсчётов, то придётся хранить все эти n отсчётов в неком кольцевом буфере, а так не надо.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|