Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы обработки данных в научных исследованиях. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
2. СВЕРТКА ФУНКЦИЙ
f
f
f
f
f
Свертка функций — математическая операция, широко исполь­зуемая в цифровой обработке сигналов. Свертка двух функций f и g определяется соотношением
gx fygx ydy fx ygydy
  
()() ()() ()().


 
Операцию свертки можно интерпретировать как «схожесть» од­ной функции с отраженной и сдвинутой копией другой. Пример: свертка двух прямоугольных импульсов дает треугольный импульс с максимумом при полном совпадении исходных импульсов (рис. 1).
Рис. 1. Свертка двух прямоугольных импульсов
Основные свойства операции свертки:
1) коммутативность —
ggf

;
2) ассоциативность — ()( );
gh f g h
 
3) линейность —
() ,
fgfgfg
  
12 1 2
() ,
g g fg fg

12 1 2
() ( ) ();af g a f g f ag

11
4) правило дифференцирования —
f
F
() ;
gfgfg


5) свойство Фурье —
fg Ff Fg
()()().

Здесь оператор * — свертка, а оператор  — умножение, F(f) —
преобразование Фурье от функции f.
2.1. Свертка дискретных сигналов
Для свертки дискретных сигналов в определении свертки пере­ходят от интеграла к сумме. Пусть 2 дискретных сигнала имеют длину M и N:
(), 0.. 1,an n N
(), 0.. 1.bm m M
Дискретной сверткой функций a и b называют величину s:
N
() ( )( ), 0.. 2.
sn ambn m n N M
0
m

Пример программы, вычисляющий дискретную свертку двух сигналов, представлен ниже.
voidConvolution(float*input1,intLen1,  float*input2,intLen2,  float*output,intLenOutput) {  intLen=LenOutput;  if(Len>Len1+Len2‐1)  { Len=Len1+Len2‐1;  }  for(inti=0;i<Len;i++)
{ floatc=0.0f;
12
for(intj=0;j<Len1;j++)
F
f
{ if(i‐j>0) { c+=input1[j]*input2[i‐j]; } } output[i]=c;  }   for(inti=Len;i<LenOutput;i++)  { output[i]=0.0f;  }  return;}
Сложность алгоритма, вычисляющего свертку двух функций,
2
равна O(N
). Ниже описан алгоритм, позволяющий вычислить
свертку двух функций и имеющий сложность O(Nlog(N)).
2.2. Алгоритм быстрой свертки
Алгоритм быстрой свертки основан на свойстве Фурье. Поскольку
()()(),
fg Ff Fg

то свертку двух функций можно вычислить, используя следующее выражение:
1
( ) ( ( ) ( )).

gFFfFg
Пример программы, выполняющей быструю свертку, представ­лен ниже. Здесь применяются массивы равной длины для упроще­ния программы. В случае, если входные данные будут представлять массивы разной длины, то перед вычислениями следует привести их к равным размерам, «дополнив» один их массивов нулями. Более того, для эффективного использования алгоритма БПФ необходимо, чтобы длины массивов были равны степени 2. Поэтому в данном примере взяты массивы равной длины, которая равна степени 2.
13
Для вычисления преобразования Фурье здесь применяются функ­ции, описанные в предыдущем разделе. Объявление этих функций выглядит следующим образом:
voidFFT(float*Rd,float*Id,intN); voidiFFT(float*Rd,float*Id,intN);
Реализация алгоритма быстрой свертки состоит из 7 блоков.
1. Выделение памяти.
2. Подготовка массивов для вычисления БПФ.
3. Выполнение двух быстрых преобразований Фурье.
4. Перемножение результатов Фурье-преобразований.
5. Вычисление обратного преобразования Фурье.
6. Копирование вещественной части результата обратного пре-
образования Фурье в выходной массив.
7. Освобождение выделенной дополнительной памяти.
voidFastConvolution(float*input1,float*input2,  float*output,intLen){  float*data_r1=(float*)malloc(Len*sizeof(fl oat));float*data_r2=(float*)malloc(Len*sizeof(fl oat));float*data_i1=(float*)malloc(Len*sizeof(fl oat));float*data_i2=(float*)malloc(Len*sizeof(fl oat));floattmp_re=0.0f;  floattmp_im=0.0f;   for(int
i=0;i<Len;i++)  { data_r1[i]=input1[i]; data_r2[i]=input2[i]; data_i1[i]=0.0f; data_i2[i]=0.0f;  }   FFT(data_r1,data_i1,Len);FFT(data_r2,data_i2,Len);
14
 for(inti=0;i<Len;i++)  { tmp_re=data_r1[i]*data_r2[i]‐data_i1[i]* data_i2[i]; tmp_im=data_i1[i]*data_r2[i]+data_i2[i]* data_r1[i]; data_r1[i]=tmp_re; data_i1[i]=tmp_im;  }  iFFT(data_r1,data_i1,Len);  for(inti=0;i<Len;i++)  { output[i]=data_r1[i];  }  free(data_r1);  free(data_r2);  free(data_i1);  free(data_i2);  return; }
Вычислительную сложность приведенного алгоритма можно оценить как O(Nlog(N)), поскольку все его этапы обладают сложно­стью, меньшей либо равной данному выражению.
15
3. КРОСС-КОРРЕЛЯЦИЯ
Кросс-корреляция двух функций — функция, характеризующая «схожесть» одной функции относительно другой, сдвинутой по времени. В основном анализ кросс-корреляционных функций при­меняют в задачах, требующих обнаружить одинаковые фрагменты различных сигналов. Кросс-корреляция определяется формулой
() ()( ) .hx f ygy xdy


Кросс-корреляция для дискретных функций a(n), b(n) будет вы­глядеть следующим образом:
() ()( ).cn aibi n
При рассмотрении сигналов на бесконечной выборке это выра­жение можно переписать:
() ( )().cn ai nbi
На практике работают с последовательностями конечной длины. Чаще всего задача кросс-корреляционного анализа сводится к обна­ружению в одной длинной последовательности данных (функция b) фрагмента, наиболее похожего на другую, более короткую последо­вательность (функция a). В таком случае кросс-корреляционную функцию можно записать так:
1
M
() ( )().
cn ai nbi

0
i
Пример программы, вычисляющей кросс-корреляционную функцию, представлен ниже.
CrossCorrelation(float*input1,intLen1,  float*input2,intLen2,  float*output,intLenOutput) {  intLen=LenOutput;  if(Len>Len1+Len2‐1)
16
{
F
Len=Len1+Len2‐1;  }  for(inti=0;i<Len;i++)  { floatc=0.0f; for(intj=0;j<Len2;j++) { if(i+j>Len1) { c+=input1[i+j]*input2[j]; } } output[i]=c;  }   for(inti=Len;i<LenOutput;i++)  { output[i]=0.0f;  }  return;}
В целом кросс-корреляционная функция очень похожа на функ­цию свертки. Существует алгоритм быстрого вычисления кросс­корреляционной функции на основе БПФ. Для нее справедливо сле­дующее равенство:
() () ().
cFaFb
*
*
Здесь
()Fb — комплексное сопряжение от результата преобра-
зования Фурье функции b. Реализация функции быстрого вычисле­ния кросс-корреляционной функции представлена ниже.
voidFastConvolution(float*input1,intLen1,  float*input2,itLen2  float*output,intLenOutput){
17
float*data_r1=(float*)malloc(LenOutput* sizeof(float)); float*data_r2=(float*)malloc(LenOutput* sizeof(float)); float*data_i1=(float*)malloc(LenOutput* sizeof(float)); float*data_i2=(float*)malloc(LenOutput* sizeof(float));
floattmp_re=0.0f;  floattmp_im=0.0f;   for(inti=0{ if(i<Len1) { data_r1[i]=input1[i]; } else { data_r1[i]=0.0f; } if(i<Len2) { data_r2[i]=input2[i]; } else { data_r2[i]=0.0f; } data_i1[i]=0.0f; data_i2[i]=}   FFT(data_r1,data_i1,LenOutput);FFT(data_r2,data_i2,LenOutput);   for(inti=0;i<LenOutput;i++)
;i<LenOutput;i++)
0.0f;
18
{ tmp_re=data_r1[i]*data_r2[i]+data_i1[i]*data_i2[i]; tmp_im=data_i1[i]*data_r2[i]‐data_i2[i]*data_r1[i]; data_r1[i]=tmp_re; data_i1[i]=tmp_im;  }  iFFT(data_r1,data_i1,LenOutput);for(inti=0;i<LenOutput;i++)  { output[i]=data_r1[i];  }  free(data_r1);  free(data_r2);  free(data_i1);  free(data_i2);  return;}
Несмотря на более эффективное выполнение вычисления кросс­корреляционной функции на основе преобразования Фурье, в ряде случаев прямая реализация с помощью двойного цикла оказывается в несколько раз быстрее.
Например, рассмотрим случай, когда длины исходных последо­вательностей имеют размеры, отличающиеся в несколько раз. При реализации алгоритма вычисления кросс-корреляционной функции с использованием преобразования Фурье необходимо выровнять длины этих массивов, чтобы выполнить умножение спектров. Та­ким образом, фактически данный алгоритм будет совершать больше количество лишних вычислений.
Очевидно, что быстрый алгоритм вычисления кросс­корреляционной функции наиболее эффективен при вычислении кросс-корреляции между двумя достаточно длинными дискретными последовательностями, длины которых примерно одинаковы. В слу­чае, когда длина одной последовательности в несколько раз (а в ряде случаев на несколько порядков) меньше другой, использовать алго­ритм вычисления кросс-корреляционной функции на основе преобра­зования Фурье будет неэффективно.
19
4. ЦИФРОВЫЕ ФИЛЬТРЫ
Цифровая фильтрация — один из наиболее мощных инстру­ментальных средств цифровой обработки сигналов. Кроме оче­видных преимуществ устранения ошибок в фильтре, связанных с флуктуациями параметров пассивных компонентов во времени и по температуре, цифровые фильтры способны удовлетворять таким техническим требованиям по своим параметрам, которых в лучшем случае было бы чрезвычайно трудно или даже невоз­можно достичь в аналоговом исполнении. Кроме того, характе­ристики цифрового фильтра могут быть легко изменены про­граммно. Поэтому они широко используются в телекоммуника­циях, приложениях адаптивной фильтрации, таких как подавле­ние эха в модемах или шума и распознавание речи.
Существует два основных типа цифровых фильтров: с конеч­ной импульсной характеристикой (КИХ) и бесконечной им­пульсной характеристикой (БИХ). Как следует из терминоло­гии, эта классификация относится к импульсным характеристи­кам фильтров. Изменяя веса коэффициентов и число звеньев КИХ-фильтра, можно реализовать практически любую частот­ную характеристику. КИХ-фильтры могут иметь такие свойства, которые невозможно достичь методами аналоговой фильтрации (в частности, совершенная линейная фазовая характеристика). Но высокоэффективные КИХ-фильтры строятся с большим чис­лом операций умножения с накоплением и поэтому требуют ис­пользования быстрых и эффективных процессоров DSP. С дру­гой стороны, БИХ-фильтры имеют тенденцию имитировать принцип действия традиционных аналоговых фильтров с обрат­ной связь. Поэтому у их импульсной характеристики бесконеч­ная длительность. Благодаря обратной связи БИХ-фильтры мо­гут реализовываться с меньшим количеством коэффициентов, чем КИХ-фильтры. Другим способом реализации КИХ- или БИХ-фильтрации являются решетчатые фильтры, которые часто используются в задачах обработки речи. Цифровые фильтры применяются в приложениях адаптивной фильтрации благодаря своему быстродействию и простоте изменения характеристик воздействием на его коэффициенты.
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]