Форум программистов, компьютерный форум, киберфорум
Цифровая обработка сигналов
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/41: Рейтинг темы: голосов - 41, средняя оценка - 4.71
ArxangelXA
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 718
1

Фильтр низких частот

13.10.2014, 01:03. Просмотров 7587. Ответов 18
Метки нет (Все метки)

формулой: On = On-1 + α(In – On-1), где O – выходное значение сигнала (отфильтрованное), In –входные значения (нефильтрованные), α - коэффициент фильтрации, принимающий значения от 0 до 1. При α равном 1, выходные значения совпадают с входными. коэффициентом α = 0.5 и α = 0.25, соответственно.

Фильтр для акселерометра.
Помогите написать код, а то я что то не очень понимаю с какой стороны подойти))

Есть жалкая попытка, но даже показывать наверно не буду там все ужасно, наверно(((

Смотрел вот это пытался переделать
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2014, 01:03
Ответы с готовыми решениями:

Фильтры высоких и низких частот C#
Всем доброго дня! Мне нужно создать фильтры высоких и низких частот для просто сигнала и для...

Фильтр нижних частот
Мне нужно симулировать фильтр нижних частот на матлабе. Моя функция получает на вход вектор с...

Фильтр частот 32,4 32,9 33,4 - для чего?
Разбираю готовое устройство по винтикам, чтобы сделать нечто похожее. Это дисплей для...

Усилитель низких частот на операционном усилителе
Помогите рассчитать усилитель низких частот на операционном усилителе производства Analog Devices...

18
_Ivana
4340 / 2007 / 254
Регистрация: 01.03.2013
Сообщений: 5,389
Записей в блоге: 22
13.10.2014, 02:10 2
Насколько я понял ваше сумбурное описание, у вас простой БИХ фильтр первого порядка, в народе называется "экспоненциальное сглаживание". Подойдите с той стороны, что напишите код реализации этого фильтра на любом известном вам языке, хоть на Матлабе, хоть на Бэйсике. Если не знаете, то на бумаге. Поймете принцип - реализуете на любом языке.
1
zss
Модератор
Эксперт С++
9269 / 8004 / 4913
Регистрация: 18.12.2011
Сообщений: 21,344
Завершенные тесты: 1
13.10.2014, 07:28 3
C++
1
2
3
4
5
6
7
8
9
10
double alfa=0.9;
double In,Out;
cin>>In;
Out=In;
while(true)
{
     cin>>In;
     Out=Out*alfa+(1.-alfa)*In;
     cout<<Out<<endl;
}
1
ArxangelXA
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 718
13.10.2014, 17:22  [ТС] 4
_Ivana, А можете посмотреть мой бред?)) Какой язык я знаю... в универе изучаю С++)))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
 
int main() {
    int i,n,j;
    int a[n], I[n];
    const alf=0,5;
    
    scanf("%d", &n);
    
    for(i = 0 ; i < n; i++) { 
        scanf("%d", &a[i]);
        }
        for(i = 0 ; i < n ; i++) { 
                for(j = 0 ; j < n - 1 ; j++) {  
                if(a[j] > a[j-1]) {           
                int tmp = a[j]; a[j] = a[j-1]+alf(I[n]-a[n-1]) ; a[j-1] = tmp; 
           }
        }
    }
}
0
_Ivana
4340 / 2007 / 254
Регистрация: 01.03.2013
Сообщений: 5,389
Записей в блоге: 22
13.10.2014, 18:24 5
Простите, увидел 3 вложенных цикла и не стал дальше вникать Экспоненциальное сглаживание - это простейший быстрый фильтр, он позволяет проводить фильтрацию "на лету", то есть к нам поступает в реальном времени входной поток (через равные промежутки времени очередное значение), мы тут же на основе него и некоторых запомненных переменных простейшей арифметикой (по вашей формуле) рассчитываем выходное значение и выталкиваем его в выходной поток! Какие в трубу вложенные циклы? Пара действий и все.
Считайте на бумаге. Задайте несколько значений входного сигнала и рассчитайте значения выходного - руками.
1
zss
Модератор
Эксперт С++
9269 / 8004 / 4913
Регистрация: 18.12.2011
Сообщений: 21,344
Завершенные тесты: 1
13.10.2014, 19:39 6
Если входные данные уже в массиве, то так
C++
1
2
3
4
5
6
7
8
double alfa=0.9;
cons int N=100;
double a[N];
...
for(int i=1;i<n;i++)
{
     a[i]=a[i-1]*alfa+a[i]*(1.-alfa);
}
1
ArxangelXA
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 718
13.10.2014, 20:22  [ТС] 7
_Ivana,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
 
int main() 
{
    const int n=1000;
    int a[n], I[n];
    const alf=0.5;
    // Тут заполнить массив I
    a[0]=I[0];
    for(int i=1;i<n;i++)
   {
        a[i] =a[i-1]+alf( I[i] - a[i-1]);
   }
}
Добавлено через 8 минут
zss, Вы преобразовали формулу? Но как?
0
_Ivana
4340 / 2007 / 254
Регистрация: 01.03.2013
Сообщений: 5,389
Записей в блоге: 22
13.10.2014, 20:37 8
Он экономит память и получает фильтрованный массив прямо в исходном, теряя первый.
А теперь постройте графики сравнения каких-нибудь исходных данных с ВЧ составляющей и фильтрованных в зависимости от альфы. Научитесь в С++ графики выводить - хорошо, нет - в Экселе 3 колонки сделайте, в первой аргумент с фиксированным шагом, во второй - сумма синусов сильно разных частот, в третьей - фильтрация второй, сравните графики. Эксперимент на пару минут на коленке, даже Матлабы ставить не надо, а суть явления демонстрирует отлично.
1
zss
Модератор
Эксперт С++
9269 / 8004 / 4913
Регистрация: 18.12.2011
Сообщений: 21,344
Завершенные тесты: 1
13.10.2014, 20:44 9
Та же формула. Раскройте скобки.
Ошибки в коде поправил прямо в Вашем сообщении.
1
_Ivana
4340 / 2007 / 254
Регистрация: 01.03.2013
Сообщений: 5,389
Записей в блоге: 22
13.10.2014, 20:55 10
И ясно видно, что природу не обманешь - задержка получается эквивалентной КИХ-фильтру с такой же характеристикой. Зато вычислений на порядки меньше, но фаза нелинейна.
1
Миниатюры
Фильтр низких частот  
ArxangelXA
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 718
13.10.2014, 21:16  [ТС] 11
zss,_Ivana, Понятно спасибо. А как теперь это переделать по arduino? Плата arduino с акселерометром
0
zss
Модератор
Эксперт С++
9269 / 8004 / 4913
Регистрация: 18.12.2011
Сообщений: 21,344
Завершенные тесты: 1
13.10.2014, 21:18 12
Переношу тему в микропроцессоры.
1
_Ivana
4340 / 2007 / 254
Регистрация: 01.03.2013
Сообщений: 5,389
Записей в блоге: 22
13.10.2014, 21:20 13
Правильно, пусть теперь с автором железячники мучаются
1
ArxangelXA
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 718
13.10.2014, 23:30  [ТС] 14
Подскажите как теперь данные отфильтровать, которые получены с акселерометра

Фильтр
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main() 
{
const int n=1000;
int a[n], I[n];
const int alf=0.5;
a[0]=I[0];
for(int i=1;i<n;i++)
{
a[i] =a[i-1]+alf*( I[i] - a[i-1]);
}
}


Код для выведения данных в ком порт
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
 # Product: 6 DOF Sensor-MPU6050 
 # SKU    : SEN0142 
 # Description:     
 # To read  accel/gyro data from 6 DOF Sensor 
*/
 
#include "Wire.h"                 
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 accelgyro;  
int16_t ax, ay, az;  // define accel as ax,ay,az
int16_t gx, gy, gz;  // define gyro as gx,gy,gz
           
#define LED_PIN 13
bool blinkState = false;
 
void setup() {
  Wire.begin();      // join I2C bus   
  Serial.begin(38400);    //  initialize serial communication
  Serial.println("Initializing I2C devices...");
  accelgyro.initialize();  
 
  // verify connection
  Serial.println("Testing device connections...");
  Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
 
  pinMode(LED_PIN, OUTPUT);  // configure LED pin
}
 
void loop() {
  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);  // read measurements from device
 
  // display tab-separated accel/gyro x/y/z values
  Serial.print("a/g:\t");
  Serial.print(ax); 
  Serial.print("\t");
  Serial.print(ay); 
  Serial.print("\t");
  Serial.print(az); 
  Serial.print("\t");
  Serial.print(gx); 
  Serial.print("\t");
  Serial.print(gy); 
  Serial.print("\t");
  Serial.println(gz);
  
  // blink LED to indicate activity
  blinkState = !blinkState;
  digitalWrite(LED_PIN, blinkState);
}
0
raxp
10202 / 6584 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
14.10.2014, 07:56 15
Вы данные фильтруете на верхнем или нижнем уровне? Судя по выводу через последовательный порт, на верхнем. В массив загоните, если анализ потом, либо сразу - пришло, запомнили глобально, взяли следующее входное и уже отфильтрованное и т.д, см. свою формулу.

Не понимаю, чем скользящее среднее или медиана не устроили.
1
ArxangelXA
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 718
14.10.2014, 16:59  [ТС] 16
raxp, мне препод скинул эту статью и сказал выбрать этот фильтр http://linkstore.ru/accelerometer.pdf
Сначала хотели использовать калмана но подумали слишком сложно, а зачем если можно этот по легче использовать)
Сказал реализовать код и сделать так что бы данные с акселератора получались, фильтровать и выводились))
Я вообще предлагал сгладить в экселе))
А что значит на верхнем иди нижнем уровне? Может и то и то? Мне кажется и там и там.

Добавлено через 7 часов 38 минут
raxp,надо низкочастотный шум убирать
0
raxp
10202 / 6584 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
14.10.2014, 19:05 17
Сначала хотели использовать калмана но подумали слишком сложно
разве сложно https://www.cyberforum.ru/post4651092.html

А что значит на верхнем иди нижнем уровне?
верхний уровень - уровень ПК, визуализация. Нижний уровень - микроконтроллер, получение данных с датчиков, сбор данных и первичная обработка.

Фильтровать можно на нижнем уровне, но при условии что ресурсы МК позволяют и процесс достаточно инерционен.
0
ArxangelXA
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 718
14.10.2014, 22:07  [ТС] 18
raxp,
Цитата Сообщение от raxp Посмотреть сообщение
разве сложно Фильтрация зашумленого сигнала
Этот код не работает! Его как та надо отредактировать, но я не знаю как((

Просто нельзя с помощью формулы, которую я написал профильтровать все полученные значения и вывести на ком порт!??
Это возможно? Вроде просто нужно объединить два кода в один, не так ли? Я просто не знаю как это сделать((
0
raxp
10202 / 6584 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
14.10.2014, 22:16 19
Работает.

Просто нельзя с помощью формулы, которую я написал профильтровать все полученные значения и вывести на ком порт!??
зачем все? Пришло значение, передаем в формулу, получаем выходное, выходное запоминаем, получаем следующее входное и вместе с предыдущим входным подставляем в формулу и т.д.

и вывести на ком порт!??
Это возможно? Вроде просто нужно объединить два кода в один, не так ли? Я просто не знаю как это сделать((
Serial.Write или Print. Откройте любой скетч serial в Arduino IDE.
0
14.10.2014, 22:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2014, 22:16

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

Фильтр низких частот. Передаточная функция
Здравствуйте. Столкнулся с проблемой в расчете фильтра низких частот. Сам фильтр прилагаю ниже....

Сглаживание ШИМ, Фильтр низких частот
Добрый вечер, ставлю своей целью с помощью atmega 32 выдавать стабильное напряжение 0-5 Вольт путем...

Полосной фильтр на Op-Amp для ОЧЕНЬ низких частот
У меня есть исходный сигнал, полезный сигнал находится между 1.4 Гц и 1.6 Гц . Вопрос, возможно ли...

Реализация фильтра низких частот
Добрый день! Подскажите пожалуйста, как реализовать программно ФНЧ. Из входных данных имею...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.