0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 41
1

Цифровая фильтрация

28.03.2014, 00:12. Показов 5296. Ответов 10
Метки нет (Все метки)

Добрый вечер. Делаю дипломную по цифровым фильтрам и пытаюсь реализовать вот такой:

Код
// Применение sinc-фильтра нижних частот. Возвращает фильтрованный сигнал 
// nF – частота фильтрации, значение из промежутка от 0 до 0.5 
// N – число элементов массива исходного сигнала 
// x – массив значений исходного сигнала 
// BW – ширина промежуточной полосы, значение из промежутка от 0 до 0.5 
double* FilterLF(double nF, int N, double *x, double BW) 
{ 
int M=4/BW-fmod(4,BW); 
double* Kernel=(double*)malloc(M*sizeof(double)); 

if (fmod(M,2)>0) 
{ 
M++; 
} 
for(int i=0;i { 
if((i-M/2)!=0) 
{ 
Kernel[i]=sin(2*pi*nF*(i-M/2))*(0.42-0.5*cos(2*pi*i/M)+0.08*cos(4*pi/M))/(i-M/2); 
} 
else 
{ 
Kernel[i]=2*pi*nF*(0.42-0.5*cos(2*pi*i/M)+0.08*cos(4*pi/M)); 
} 
} 
double dSum; 
for(i=0;i { 
dSum+=Kernel[i]; 
} 
for(i=0;i { 
Kernel[i]/=dSum; 
} 
return(Convolution(x,N,Kernel,M)); 
}
Кто-нибудь знает, что за функция convolution?
P.S. И пользуясь возможностью, подскажите простые способы фильтрации данных(любых).
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2014, 00:12
Ответы с готовыми решениями:

Цифровая радиосвязь на 10км
Добрый день :) Есть необходимость связать 2 устройства на МК на большом расстоянии, как минимум...

Цифровая автоподстройка частоты на МК
Доброго времени суток! Подскажите с чего начать? Нужно запрограммировать микроконтроллер,чтобы...

Цифровая схема шифрования/дешифрования машины Энигма
Всем добрый вечер! Подскажите, пожалуйста, как можно реализовать цифровую схемы (схемы шифровки и...

Цифровая обработка сигналов - определение вида модуляции/манипуляции
Здравствуйте, с помощью SDR-приемника и ПЭВМ реализую комплекс радиомониторинга, где одной из задач...

10
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
28.03.2014, 01:03 2
и пытаюсь реализовать вот такой:
Кто-нибудь знает, что за функция convolution?
код не ваш. Что же вы пытаетесь, если сами не знаете, а-яй-яй.

http://www.mathworks.com/help/... ution.html
  • Уолт Кестер. Цифровые фильтры
  • А.Б. Сергиенко. Алгоритмы адаптивной фильтрации. Особенности реализации в Matlab
  • S.Padmakumar, V.Agarval, R.Kallol. Калмановская фильтрация
  • Белодедов. Учебное пособие. Методы проектирования цифровых фильтров

Литература по ЦОС и алгоритмам

простые способы фильтрации данных(любых).
фильтрация фильтрации - рознь, как и данные. К примеру, скользящее среднее и медианная фильтрация. Обе просты, но первая не избавит от импульсных помех, а вторая чувствительна к частотной областии и запросто может привести к частотным потерям при некорректном применении.
1
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 41
28.03.2014, 11:32  [ТС] 3
Цитата Сообщение от raxp Посмотреть сообщение
код не ваш. Что же вы пытаетесь, если сами не знаете, а-яй-яй.
Я и не скрываю, что код не мой. Нашёл его в интернете и возникла проблема с convolution.

Цитата Сообщение от raxp Посмотреть сообщение
http://www.mathworks.com/help/matlab...nvolution.html
С мат лабом понятно, в c++ как её сделать то?

Цитата Сообщение от raxp Посмотреть сообщение
фильтрация фильтрации - рознь, как и данные. К примеру, скользящее среднее и медианная фильтрация. Обе просты, но первая не избавит от импульсных помех, а вторая чувствительна к частотной областии и запросто может привести к частотным потерям при некорректном применении.
Попробую медианную фильтрацию.
На данным момент реализовал фильтры на основе скользящего среднего, с весовым коэффициентом и фильтр Калмана.
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
28.03.2014, 12:13 4
С мат лабом понятно, в c++ как её сделать то?
продолжаем тупо долбить одно и то же. Пройдитесь по ссылке, прочитайте что делает функция и реализуйте в С++.
0
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 41
28.03.2014, 12:51  [ТС] 5
Цитата Сообщение от raxp Посмотреть сообщение
продолжаем тупо долбить одно и то же. Пройдитесь по ссылке, прочитайте что делает функция и реализуйте в С++.
Я не понимаю о чём здесь идёт речь. Какая-то свёртка.
Matlab M
1
2
3
4
5
6
7
8
9
Polynomial multiplication and division correspond to the operations convolution and deconvolution. The functions conv and deconv implement these operations.
 
Consider the polynomials a(s) = s2 + 2s + 3 and b(s) = 4s2 + 5s + 6. To compute their product,
 
a = [1 2 3]; b = [4 5 6];
c = conv(a,b)
 
c =
     4    13    28    27    18
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
28.03.2014, 13:03 6
Т.е. вы взялись за задачу, не понимая сути процесса и физического смысла того что делаете, взяли готовый матлабовский код, не понимая что он делает и без желания воспользоваться справкой по Матлаб. Как так можно? Ссылка на литературу ЦОС дана не для красивых глаз или бросьте эту затею.

Что такое свертка
0
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 41
28.03.2014, 13:10  [ТС] 7
Цитата Сообщение от raxp Посмотреть сообщение
взяли готовый матлабовский код
код на с++
Цитата Сообщение от raxp Посмотреть сообщение
не понимая сути процесса и физического смысла того что делаете
Всё что идёт до последней строчки, я примерно понимаю.
Проблему вызывает только функция convolution. В источнике, в котором я взял код, автор не описал её.
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
28.03.2014, 13:22 8
Лучший ответ Сообщение было отмечено narax как решение

Решение

Аж странно, а у меня сложилось впечатление что весь алгоритм очень даже подробно и по-русски расписан http://www.super-profi.com/?p=23

Мало того, присутствует реализация свертки на Си в виде функции:
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
// Свертка по алгоритму выходной стороны
// Возвращает массив из N+M-1 чисел, где N — число элементов сигнала х,
// M — число элементов сигнала h, х и h — свертываемые сигналы
 
double* Convolution(double *x,int N,double *h, int M)
 
{
 
double* dRes=(double*)malloc((N+M-1)*sizeof(double));
 
for(int i=0;i<N+M-1;i++)
 
{
 
double iSum=0;
 
for(int j=0;j=0)&&(i-j<N))
 
{
 
iSum+=h[j]*x[i-j];
 
}
 
}
 
dRes[i]=iSum;
 
}
 
return(dRes);
 
}
1
2012 / 1284 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
28.03.2014, 18:11 9
Цитата Сообщение от narax Посмотреть сообщение
что за функция convolution?
фильтрация сигнала есть его свертка с импульсной характеристикой фильтра. Поэтому ваша функция состоит из двух частей - формирование импульсной характеристики и собственно свертка. Импульсная характеристика формируется как sinc функция sin(pi * W) / (pi * W) умноженная на окно блэкмана. (W - полоса). Для свертки можно использовать код, предложенный raxp, на всякий случай выложу свой, аналогичный вариант, в котором формирование ИХ и свертка выполняются в одной функции (мне так было удобнее)
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
#define Wn (SamplingRate / 8) // band for lowpass FIR filter
#define order 20
 
void FIR_Filter(/*int order, */float *x, float *y)
{
    int32_t i, j;
    float b[order+1];//[lengthFrameForEnvelope];
    uint32_t idx = 0;
    float sumB = 0;
    const float piWn = pi * Wn;
 
    for(i=-order/2; i<=order/2; i++)
    {
        b[idx] = Wn * sinf(piWn * (i+.00001)) / (piWn * (i+.00001)) *           // Wn * sin(pi*i*Wn) / (pi*i*Wn)
                 (0.54f - 0.46f * cosf(2*pi*idx/order));                        // hamming
        sumB += b[idx];
        idx ++;
    }
 
    for(i=0; i<=order; i++)
        b[i] /= sumB;
 
    for(i=0; i<lengthFrameForEnvelope; i++) // convolution
    {
        y[i] = .0;
        for(j=0; j<(i <= order ? i : order); j++)
        {
            y[i] += b[j] * x[i-j];
        }
    }
    for(i=lengthFrameForEnvelope-order/2; i<lengthFrameForEnvelope; i++)
        y[i] = .0;
}
Добавлено через 1 минуту
lengthFrameForEnvelope вэтом коде - длина выборки сигнала
1
11 / 11 / 0
Регистрация: 20.11.2013
Сообщений: 152
23.04.2014, 18:46 10
А я это реализовывал так:

1. Получал массив для фильтрации.
2. Далее надо расчитать идеальную импульсную характеристику фильтра. Количество коэффициентов = порядку фильтра + 1.
3. Затем надо "Взвесить" эту идеальную импульсную характеристику:
а) Расчитать взвешивающие коэффициенты по формуле для sinc окна.
б) Помножить импульсную характеристику на взвешивающие коэффициенты.

Всё - фильтр расчитан.

Код для ФНЧ:

Получение идеальной импульсной характеристики (формула коэффициентов для ФНЧ КИХ, надеюсь, известна):

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
void Low_Pass_Coeffs_Calc(long N,long Fd,long Fs,float *Impulse)
//Рассчет коэффициентов для ФНЧ КИХ.
{
// N - Длина фильтра
// Fd - Частота дискретизации входных данных
// Fs - Частота полосы пропускания
// Impulse - импульсная характеристика (коэффициенты фильтра) фильтра
float M = N/(float)2; //Индекс среднего коэффициента фильтра.
 
//Теперь надо посчитать идеальную импульсную характеристику фильтра.
//При N = M она считается как Частота среза/Пи.
//Частоту среза нахожу. По формуле (2Пи*Частоту полосы пропускания)/Частоту дискретизации)
float Wc;
Wc = (2*M_PI*Fs)/(float)Fd;
//Теперь надо заморочиться нахождением идеальных значений импульсной характеристики для фильтра
//Формула для всех коэффициентов, кроме случая n = M:
//sin(Wc*(n-M))/(M_PI*(n-M)), где n = i
for (long i = 0; i < N+1; i++)
 {
  //Считаю коэффициенты по формуле
  if (i == M)
   {
    Impulse[i] = Wc/(float)M_PI;
   }
    else
     {
      Impulse[i] = sinl(Wc*(i-M))/(float)(M_PI*(i-M));
     }
 }
}
Расчет взвешивающего Sinc окна (корректирующих коэффициентов). Из кода кусок выдрал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
if (Index == 10)//Sinc окно. Окно Ланцоша. Окно высокого разрешения
 {
  float X;
   for (long i = 0; i < N; i++)
    {
     X = 0;
      X = ((2*i)/(float)(N-1))-1;
     Out[i] = 0;
     Out[i] = sin(M_PI*X);
     if ((M_PI*X) != 0) Out[i] = Out[i]/(M_PI*X);
    }
 }
Out - массив корректирующих коэффициентов.

И все - дальше перемножение i-х элементов идеальной импульсной характеристики и взвешивающих коэффициентов.

Convolution - обычно это свертка так называется
2
11 / 11 / 0
Регистрация: 20.11.2013
Сообщений: 152
01.05.2014, 13:49 11
Позволю себе еще свою реализацию функции линейной свертки привести.
На вход надо только массивы размерностью N+1 подавать, где N - размер большего массива.
Меньшие массивы независимо от их размера должны быть дозаполнены нулями. Только сразу скажу, что надо их сначала инициализировать (Array[i] = 0), чтобы какашки никакой потом не получалось в результатах (мало ли чем выделенная память заполнена).

C++
1
2
3
4
5
6
7
8
9
10
11
12
void Vector_Conv(long Size,double *A,double *B,double *Result) //Линейная свертка векторов.
{
 Result[0] = A[0]*B[0];
   for (long h = 1; h < Size; h++)
    {
      Result[h] = 0;
        for (long t = h; t > -1; t--)
         {
          Result[h] += A[abs(t-h)]*B[t];
         }
    }
}
Size - размерность (N+1 как раз).
Довольно часто при реализации фильтров эта свертка пригождается.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2014, 13:49

Цифровая фоторамка
Хочу попробовать собрать мини цифровую фоторамку - подарок для любимой девушки. Видел похожие...

Аналого-цифровая хрень для ввода-вывода
Динная хрень была изображена с целью улучшения понимания глубокого сакрального смысла происходящих...

цифровая фильтрация?
Есть у меня АЦП в stm32, и считываю я показания терморезистора, и вижу я на выходе температуру с...

Цифровая фильтрация
Доброго времени суток! с цифровой обработкой сигналов только начинаю разбираться, есть практическая...


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

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

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