Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Методы обработки данных в научных исследованиях. Учебное пособие
.pdf
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
Пример программы, вычисляющий дискретную свертку двух
сигналов, представлен ниже.
voidConvolution(float*input1,intLen1,
float*input2,intLen2,
float*output,intLenOutput)
{
intLen=LenOutput;
if(Len>Len1+Len2‐1)
{
Len=Len1+Len2‐1;
}
for(inti=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(inti=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(inti=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,intLen1,
float*input2,intLen2,
float*output,intLenOutput)
{
intLen=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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
