МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
ДЕРЖАВНИЙ ВИЩИЙ НАВЧАЛЬНИЙ ЗАКЛАД
«УЖГОРОДСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ»
Інженерно-технічний факультет
Кафедра копм’ютерних систем та мереж
Розрахунково-графічна робота
з дисципліни
«Теоретичні основи цифрової обробки сигналів»
на тему:
«Розрахунок параметрів виконання алгоритму ШПФ»
Завдання
Варіант № 20
Розрахувати параметри виконання алгоритму ШПФ з такими вхідними даними:
Кількість точок
16384
Основа ШПФ
2
Прорідження
частотне
Частота роботи процесора
2,5 МГц
Розрядність вхідних даних
12(6+6)
Тип вхідного інтерфейсу
DMA
Тип вихідного інтерфейсу
PCI
Анотація
В даній розрахунково-графічній роботі розглянуто спосіб реалізації алгоритму ШПФ за основою 2 для 12-розрядних вхідних даних з частотним прорідженням, детально описано механізми обчислення швидкого перетворення Фур’є за заданною основою, обчислено часові ресурси для виконання обчислення, створена функціональна схема системи та написана програма, що реалізує вказаний алгоритм ШПФ.
Зміст
Вступ 5
1. Теоретичний розділ 6
1.1. Основні визначення опису ШПФ 6
1.2. Властивості повертаючих множників 6
1.1. Основні формули 7
2. Аналіз (розробка) блок-схеми виконання заданої функції обробки сигналів та зображень на заданому типі процесора 10
2.1. Побудова графа алгоритму ШПФ з основою 2 10
2.2. Біт інверсний порядок видачі даних 11
2.3. Блок-схема перетворення 13
3 Розрахунковий розділ 14
4 Розробка функціональної схеми 16
5 Розробка програми виконання алгоритму ШПФ 18
Вступ
Перетворення Фур'є - це функція, що описує амплітуду та фазу кожної синусоїда, що відповідає певній частоті. Амплітуда представляє висоту кривої, а фаза - початкову точку синусоїда.
Перетворення Фур'є використовується в баготьох галузях науки – в фізиці, теоріЇ чисел, комбинаториці, обробці сигналів, теорії ймовірності, статистиці, криптографції, акустиці, океанології, оптиці, геометрії, та багатьох інших. При обробці сигналів різної природи перетворення Фур'є звичайно розглядається як трансформація сигналу з часової ділянки в частотну.
Дискретне перетворення Фур'є грає важливу роль при аналізі, синтезі та розробці систем та алгоритмів цифрової обробки сигналів. Одна з причин того, що анализ Фур'є грає таку важливу роль в цифровій обрабці сигналів, полягає в існуванні ефективних алгоритмів дискретного перетворення Фур'є.
Ці перетворення зворотні, при чому зворотнє перетворення має практично таку ж саму форму, що й пряме перетворення.
Швидке перетворення Фур'є застосовується в багатьох галузях: радіолокации, стисненні відео та зображень, геології. Багато з цих задач вимагають виконання перетворень в реальному часі, з мінімальною часовою затримкою обчислень.
Для зменшення часу, необхідного для виконання перетворень, можливо розпаралелювання задачі, виконання її на паралельній обчислювальній системі.
1. Теоретичний розділ
1.1. Основні визначення опису ШПФ
Визначення 1. Дано кінцеву послідовність x0, x1, x2,..., xN-1 (у загальному випадку комплексних чисел). ДПФ полягає в пошуку послідовності X0, X1, X2,..., XN-1, елементи якої обчислюються за формулою:
(1)
Визначення 2. Зворотне ДПФ полягає в пошуку послідовності x0, x1, x2,..., xN-1, елементи якої обчислюються за формулою:
(2)
Основною властивістю перетворень (1) і (2) є те, що з послідовності {x} отримується (при прямому перетворенні) послідовність {X}, а якщо застосувати до {X} зворотне перетворення, то знову отримується вихідна послідовність {x}.
Визначення 3. Величина називається повертаючим множником.
1.2. Властивості повертаючих множників
При k = 1
Пряме перетворення Фур’є можна виразити через повертаючі множники. Тоді формула (1) матиме вигляд: (3)
Геометричне тлумачення повертаючих множників наведене на рис.1. Комплексне число (rejφ) представлене у вигляді вектора, що виходить із початку координат (r - модуль числа, а φ – аргумент). Модуль відповідає довжині вектора, а аргумент - куту повороту. Модуль повертаючого множника . дорівнює одиниці, а фаза - 2π/N. Оскільки при множенні комплексних чисел, представлених у показниковій формі, їхні модулі перемножуються, а аргументи підсумовуються, множення вихідного числа на повертаючий множник не змінить довжину вектора, але змінить його кут. Тобто, відбудеться повертання вектора на кут 2π/N.
З формули (3) можна визначити геометричний зміст перетворення Фур’є таким чином: представити N комплексних чисел-векторів з набору {x}, кожне у вигляді суми векторів з набору {X}, повернених на кути, кратні 2π/N.
Рис. 1. Геометричне тлумачення повертаючих множників
1.1. Основні формули
Теорема 1. Якщо комплексне число представлене у вигляді e j2πN, де N - ціле, то e j2πN = 1.
Теорема 2. Величина періодична по k і по n з періодом N. Тобто, для будь-яких цілих l і m виконується рівність:
(4)
Теорема 3.
Для величини справедлива формула: (5)
З наведених теорем визначається основна ідея алгоритму ШПФ:
Необхідно розділити суму (1) з N доданків на дві суми по N/2 доданків, і обчислити їх окремо. Для обчислення кожної з підсум, треба їх теж розділити на дві і т.д.
Необхідно повторно використовувати вже обчислені доданки.
При обчисленні алгоритму ШПФ застосовують або "проріджування за часом" (в першу суму попадають доданки з парними номерами, а в другу - з непарними), або "проріджування за частотою" (в першу суму попадають перші N/2 доданків, а в другу - інші). Обидва варіанти рівноцінні. В силу специфіки алгоритму доводиться застосовувати тільки N, що є ступенями 2.
Теорема 4. Визначимо ще дві послідовності: {x[even]} і {x[odd]} через послідовність {x} таким чином:
x[even]n = x2n, x[odd]n = x2n+1, (6)
n = 0, 1,..., N/ 2-1
Нехай до цих послідовностей застосовані ДПФ і отримані результати у вигляді двох нових послідовностей {X[even]} і {X[odd]} по N/2 елементів у кожній.
Елементи послідовності {X} можна виразити через елементи послідовностей {X[even]} і {X[odd]} за формулою:
(7)
Формула (7) дозволяє скоротити число множень удвічі (не враховуючи множень при обчисленні X[even]k і X [odd]k), якщо обчислювати Xk не послідовно від 0 до N - 1, а попарно: X0 і XN/2, X1 і XN/2+1,..., XN/ 2-1 і XN. Пари утворяться за принципом: Xk і XN/2+k.
Теорема 5. ДПФ можна обчислити і за формулою:
(8)
З теореми випливає, що можна не зберігати обчислені значення X[even]k і X[odd]k після обчислення чергової пари, і одне обчислення можна використовувати для обчислення двох елементів послідовності {X}.
На цьому кроці буде виконане N/2 множень комплексних чисел. Якщо застосувати подібні схеми для обчислення послідовностей {X[even]} і {X[odd]}, то кожна з них вимагатиме N/4 множень, разом ще N/2. Продовжуючи аналогічно далі log2N разів, можна дійти до сум, що містять лише один доданок, так що загальна кількість множень рівна (N/2)log2N.
Висновок:
В основі алгоритму ШПФ лежать такі формули:
(9)
Відомі два різновиди алгоритмів ШПФ - проріджування за часом (decimation in time - DIT) і проріджування по частоті (decimation in frequency - D1F), що мають однакову обчислювальну складність.
2. Аналіз (розробка) блок-схеми виконання заданої функції обробки сигналів та зображень на заданому типі процесора
2.1. Побудова графа алгоритму ШПФ з основою 2
Якщо число N є ступенем 2, то його можна записати як (N/2) * 2; аналогічно N/2 = (M/4) * 2 і т.д. В результаті елементи початкового одновимірного масиву можна розподілити таким чином, щоб елементарними операціями були двохточкові ШПФ. Для побудови графу N-точкового ШПФ з основою 2 потрібно визначити кількість ярусів (Nяр) графу та кількості метеликів (Nм) на кожному ярусі таким чином:
Nяр = Log2N, для N=16384, Log216384 = 14;
Nм = N/2 = 16384/2= 8192.
Метелик ШПФ показаний на рис. 2, де
Рис. 2. Двохточкове ШПФ (Метелик)
X, Y - результати базової операції; А, B - вхідні відліки; WN – повертаючих множники.
Граф-алгоритм для 32-точкового ШПФ за основою 2 з частотним прорідженням показаний на рис. 3.
Рис.3. Граф 32-точкового ШПФ за основою 2 з прорідженням за частотою
На рис. 3 кільцям відповідають двохточкові ШПФ, стрілками зображено процедуру множення на повертаючі множники. Елементи пам’яті зображено точками та пронумеровано зверху вниз.
2.2. Біт інверсний порядок видачі даних
Для реалізації ШПФ з прорідженням по частоті 16384-точкове ШПФ розділяють на два 8192-точкові ШПФ, далі на чотири 4096-точкових ШПФ, і так далі аж до 2- точкових ШПФ. Для обрахунку 2-точкового ШПФ використовуються формули „метелика”.
Отже, в результаті для виконання 16384-точкового ШПФ необхідно 8192 ітерації. При чому, після того, як закінчується обчислення першої ітерації, немає необхідності зберігати які-небудь попередні результати. Результати обчислення першої ітерації можуть бути збережені в тих же регістрах чи комірках пам'яті, що спочатку зберігалися вхідні дані. Так само, коли закінчується обчислення другого каскаду, результати обчислення першого каскаду можуть бути вилучені. У такий же спосіб здійснюється обчислення останнього каскаду, заміняючи в пам'яті проміжний результат обчислення попереднього каскаду.
Слід зауважити, що результат виконання ШПФ отримуємо у біт-інверсному порядку. Тому для адресів вихідних відліків необхідно застосувати біт-інверсний алгоритм. Суть даного алгоритму полягає у наступному: десятковий індекс n перетворюють в його двійковий еквівалент. Потім двійкові розряди розташовуються у зворотньому порядку і перетворюються назад у десяткове число. Приклад наведений у табл. 1.
Таблиця 1. Біт-інверсне прорідження
Номер
Двійкове представлення
Двійкова інверсія
Двійково-інверсний номер
0
00000000000000
00000000000000
0
1
00000000000001
10000000000000
8192
2
00000000000010
01000000000000
4096
3
00000000000011
11000000000000
12288
4
00000000000100
00100000000000
2048
5
00000000000101
10100000000000
10240
6
00000000000110
01100000000000
6144
7
00000000000111
11100000000000
14336
8
00000000001000
00010000000000
1024
9
00000000001001
10010000000000
9216
10
00000000001010
01010000000000
5120
11
00000000001011
11010000000000
13312
…
…
…
…
16381
11111111111101
1011111111111
12287
16382
11111111111110
01111111111111
8191
16383
11111111111111
11111111111111
16383
2.3. Блок-схема перетворення
Рис. 4. Блок-схема алгоритму 8192-точкового перетворення за основою 2
3 Розрахунковий розділ
Частота роботи процесора: , звідси цикл виконання команди: .
base – основа базової операції «метелик»;
N – к-ть точок вх. перетворення;
base=2; N=16384;
– кількість етапів перетворення;
– кількість базових операцій «метелик» на одному етапі;
– кількість базових операцій у всьому перетворенні;
;
;
Для виконання базової операції «метелик» необхідно:
4 операцій множення;
6 операцій додавання;
6 операцій читання з пам`яті:
- 2*2=4 (для читання дійсної та уявної частини вхідних відліків);
- 1*2=6 (для читання дійсної та уявної частини комплексних коеф.);
4 операцій запису:
- 2*2=4 (для запису дійсної та уявної частини вхідних відліків);
В результаті на одну базову операцію припадає 20 операцій: Nна 1 мет=20 (оп)
Тривалість виконання обчислення ШПФ:
Частота роботи порту DMA f=2,5 МГц;
Тнадх=400 нс– такт надходження даних;
Частота роботи PCI шини: , звідси цикл виходу команди: .
Тривалість виходу даних з процесора:
Твих=7,519нс – такт виходу даних;
Тривалість надходження даних у процессор, виходу із нього та тривалість обчислення ШПФ:
4 Розробка функціональної схеми
Рис.5. Фунціональна схема
Прямий доступ до пам'яті (англ. прямого доступу до пам'яті, DMA) - режим обміну даними між пристроями або ж між пристроєм і основною пам'яттю (RAM), без участі центрального процесора (ЦП). У результаті швидкість передачі збільшується, так як дані не пересилаються в ЦП і назад.
В оригінальній архітектурі IBM PC (шина ISA) був можливий лише за наявності апаратного DMA-контролера (мікросхема з індексом Intel 8237).
DMA-контролер може отримувати доступ до системної шини незалежно від центрального процесора. Контролер містить кілька регістрів, доступних центральному процесору для читання і запису. Регістри контролера задають порт (який повинен бути використаний), напрям перенесення даних (читання / запис), одиницю переносу (побайтно / послівний), число байтів, яке слід перенести.
ЦП програмує контролер DMA, встановлюючи його регістри. Потім процесор дає команду пристрою (наприклад, диску) прочитати дані у внутрішній буфер. DMA-контролер починає роботу, посилаючи пристрою запит читання (при цьому пристрій навіть не знає, чи прийшов запит від процесора або від контролера DMA). Адреса пам'яті вже знаходиться на адресній шині, так що пристрій знає, куди слід переслати наступне слово зі свого внутрішнього буфера. Коли запис закінчена, пристрій посилає сигнал підтвердження контролеру DMA. Потім контролер збільшує використовуваний адресу пам'яті і зменшує значення свого лічильника байтів. Після чого запит читання повторюється, поки значення лічильника не буде дорівнювати нулю. По завершенні циклу копіювання пристрій ініціює переривання процесора, що означає завершення перенесення даних. Контролер може бути багатоканальним, здатним паралельно виконувати декілька операцій.
PCI (Peripheral component interconnect, дослівно: взаємозв'язок периферійних компонентів) — шина вводу/виводу для підключення периферійних пристроїв до материнської плати комп'ютера.
Стандарт на шину PCI визначає:
фізичні параметри (наприклад, роз'єми і розведення сигнальних ліній);
електричні параметри (наприклад, напруги);
логічну модель (наприклад, типи циклів шини, адресацію на шині);
Розвитком стандарту PCI займається організація PCI Special Interest Group.
PCI-пристрої з погляду користувача налаштовуються самостійно (plug and play). Після старту комп'ютера системне програмне забезпечення обстежує конфігураційний простір PCI кожного пристрою, підключеного до шини й розподіляє ресурси. Кожен пристрій може зажадати до семи діапазонів в адресному просторі пам'яті PCI або в адресному просторі вводу-виводу PCI. Крім того, пристрої можуть мати ПЗП, що містить код для процесорів x86 або PA-RISC, Open Firmware (системне ПЗ комп'ютерів на базі SPARC) або драйвер EFI.
Налаштування переривань здійснюється також системним програмним забезпеченням (на відміну від шини ISA, де налаштування переривань здійснювалося перемикачами на карті). Запит на переривання на шині PCI передається за допомогою зміни рівня сигналу на одній з ліній IRQ, тому є можливість роботи декількох пристроїв з однією лінією запиту переривання; звичайно системне ПЗ намагається виділити кожному пристрою окреме переривання для збільшення продуктивності.
5 Розробка програми виконання алгоритму ШПФ
Структуру програми, що виконує обчислення за алгоритмом ШПФ можна уявити наступним чином:
Рис.5.1. Узагальнена блок-схема алгоритму
Кожен з трьох циклів призначений для правильного визначення номеру відліку в конкретний момент обчислення. Перший цикл визначає номер ярусу, другий – номер базової операції у ярусі, третій – номер відліку у базовій операції.
Вводиться масив, що зберігає відліки, в програмі названий matrix, його номер відповідно – N (кількість точок перетворення). Кожен елемент масиву – комплексне число. Інший массив W призначений для зберігання повертаючи множників. На кожну базову операцію припадає 1 повертаючих множника, тому його розмір: 14*16384*1=229376 (14 – кількість ярусів, 16384 – кількість базових операцій в ярусі). Елемент цього масиву є так само комплексним числом.
Текст програми, написаної на мові С, поданий нижче
N=16384;
struct complex
{ double re;
double im;
};
complex W[3*N];
complex matrix[N];
int i,imax,j,x1,x2,x3,x4;
int f; //номер етапу
int p; //номер операції в етапі
complex temp1,temp2,temp3,temp4;
f=0;
for(imax = N-1; imax <=0; imax = (imax+1)/4 – 1)
{ p=0;
for(j = 0; j < N; j = j + (imax+1)*4)
{
x1 = j + (imax+1)*0;
x2 = j + (imax+1)*1;
x3 = j + (imax+1)*2;
x4 = j + (imax+1)*3;
for (i = 0; i <= imax; i++)
{
temp1.re=
matrix[x1+i].re + matrix[x3+i].re*W[n*16384+p*3+1].re –
- matrix[x3+i].im*W[n*16384+p*3+1].im +
+ matrix[x2+i].re*W[n*16384+p*3+0].re –
- matrix[x2+i].im*W[n*16384+p*3+0].im +
+ matrix[x4+i].re*W[n*16384+p*3+2].re –
- matrix[x4+i].im*W[n*16384+p*3+2].im;
temp1.im=
matrix[x1+i].im + matrix[x3+i].re*W[n*16384+p*3+1].im +
+ matrix[x3+i].im*W[n*16384+p*3+1].re +
+ matrix[x2+i].re*W[n*16384+p*3+0].im +
+ matrix[x2+i].im*W[n*16384+p*3+0].re +
+ matrix[x4+i].re*W[n*16384+p*3+2].im +
+ matrix[x4+i].im*W[n*16384+p*3+2].re;
temp2.re=
matrix[x1+i].re - matrix[x3+i].re*W[n*16384+p*3+1].re +
+ matrix[x3+i].im*W[n*16384+p*3+1].im +
+ matrix[x2+i].re*W[n*16384+p*3+0].im +
+ matrix[x2+i].im*W[n*16384+p*3+0].re -
- matrix[x4+i].re*W[n*16384+p*3+2].im –
- matrix[x4+i].im*W[n*16384+p*3+2].re;
temp2.im=
matrix[x1+i].im - matrix[x3+i].re*W[n*16384+p*3+1].im -
- matrix[x3+i].im*W[n*16384+p*3+1].re -
- matrix[x2+i].re*W[n*16384+p*3+0].re +
+ matrix[x2+i].im*W[n*16384+p*3+0].im -
- matrix[x4+i].re*W[n*16384+p*3+2].re +
+ matrix[x4+i].im*W[n*16384+p*3+2].im;
temp3.re=
matrix[x1+i].re + matrix[x3+i].re*W[n*16384+p*3+1].re –
- matrix[x3+i].im*W[n*16384+p*3+1].im -
- matrix[x2+i].re*W[n*16384+p*3+0].re +
+ matrix[x2+i].im*W[n*16384+p*3+0].im +
+ matrix[x4+i].re*W[n*16384+p*3+2].re –
- matrix[x4+i].im*W[n*16384+p*3+2].im;
temp3.im=
matrix[x1+i].im + matrix[x3+i].re*W[n*16384+p*3+1].im +
+ matrix[x3+i].im*W[n*16384+p*3+1].re -
- matrix[x2+i].re*W[n*16384+p*3+0].im -
- matrix[x2+i].im*W[n*16384+p*3+0].re +
+ matrix[x4+i].re*W[n*16384+p*3+2].im +
+ matrix[x4+i].im*W[n*16384+p*3+2].re;
temp4.re=
matrix[x1+i].re - matrix[x3+i].re*W[n*16384+p*3+1].re +
+ matrix[x3+i].im*W[n*16384+p*3+1].im -
- matrix[x2+i].re*W[n*16384+p*3+0].im –
- matrix[x2+i].im*W[n*16384+p*3+0].re -
- matrix[x4+i].re*W[n*16384+p*3+2].re +
+ matrix[x4+i].im*W[n*16384+p*3+2].im;
temp4.im=
matrix[x1+i].im - matrix[x3+i].re*W[n*16384+p*3+1].im -
- matrix[x3+i].im*W[n*16384+p*3+1].re +
+ matrix[x2+i].re*W[n*16384+p*3+0].re -
- matrix[x2+i].im*W[n*16384+p*3+0].im -
- matrix[x4+i].re*W[n*16384+p*3+2].re +
+ matrix[x4+i].im*W[n*16384+p*3+2].im;
matrix[x1+i].re = temp1.re;
matrix[x1+i].im = temp1.im;
matrix[x2+i].re = temp2.re;
matrix[x2+i].im = temp2.im;
matrix[x3+i].re = temp3.re;
matrix[x3+i].im = temp3.im;
matrix[x4+i].re = temp4.re;
matrix[x4+i].im = temp5.im;
}
p++;
}
f++;
}
Організація змінної j передбачає, що вона буде вибирати групу відліків для базової операції, спираючись на неї визначаються їх адреси змінними х1, х2, х3, х4. Ці адреси зміщуються за певним законом для кожної групи відліків, використовуючи третій цикл, що обробляю вже безпосередньо групу.
Змінні temp1, temp2, temp3, temp4 – зберігають тимчасові значення результатів обчислення. Значення f та p визначають адресу повертаю чого множника для даної базової операції.
Значення imax+1 означає кількість груп, по яких проводиться збірка на конкретному ярусі і приймає значення: 16384, 8192,4096, 2048, …, 2, 1. На першому ярусі є 16384 групи операцій по 2 відліка кожна, на другому – 8192 груп і збірка ведеться по 4 відлікам і т.д.
Організація змінної j передбачає, що вона буде вибирати групу відліків для базової операції, спираючись на неї визначаються їх адреси змінними х1, х2. Ці адреси зміщуються за певним законом для кожної групи відліків, використовуючи третій цикл, що обробляє вже безпосередньо групу.
Змінні temp1, temp2 – зберігають тимчасові значення результатів обчислення. Значення f та p визначають адресу повертаючого множника для даної базової операції.
Висновки
В даній розрахунково-графічній роботі було розглянуто приклад реалізації алгоритму ШПФ за основою 2 для 12-розрядних вхідних даних з частотним прорідженням, було обчислено тривалість виконання обчислення ШПФ, тривалість надходження даних у процесор та тривалість обчислення ШПФ. Вхідні дані представляються 16384-ма вхідними відліками, що містять дійсну та уявну частину.
В результаті набуто досвід у проектуванні обчислювальної системи, створена функціональна схема системи за допомогою вхідного інтерфейсу типу DMA та вихідного інтерфейсу типу PCI. А також була написана програма, що реалізує вказаний алгоритм ШПФ.
Література
Цифровые фильтры и устройства обработи сигналов на интегральных микросхемах: Справочное пособие/Ф.Б.Высоцкий, В.И. Алексеев, В.П. Пачин и др.; Под ред. Б.Ф.Высоцкого.-М.: Радио и связь, 1984.-216с.
Куприянов М. С., Матюшкин Б. Д. Цифровая обработка сигналов: процессоры, алгоритмы, средства проектирования. – Спб. : Политехника, 1998.
Цифровой процессор обработки сигналов TMS32010 и его применение/Под ред. А.А.Ланнэ.-Л.:ВАС,1990.-296 с.
Бабак В.П., Хандецький А.І., Шрюфер Е. Обробка сигналів: підручник для вузів., К., Либідь, 1996.- 390с.
Мельник А.А. Проектирование поточного процессора БПФ на специализированных БИС.- Львов, 1990.- 43с.
Применение цифровой обработки сигналов/ Под ред. Э.Оппенгейма.- М. Мир, 1980.- 552с.
Сверхбольшие интегральные схемы и современная обработка сигналов: Пер. с англ.- М.: Радио и связь, 1989.- 472с.
Справочник по устройствам цифровой обработки информации/ Н.А.Виноградов, В.Н.Яковлев, В.В.Воскресенский и др.- К:Тэхника, 1988.- 455с.
Шрюфер Е. Обробка сигналів. Цифрова обробка дискретизованих сигналів.- К.: Либідь, 1992.- 226с.
Яцимірський М. М. Швидкі алгоритми ортогональних тригонометричних перетворень. - Львів: Академічний Експрес, 1997. - 219 с.
Рабинер Л., Гоулд Б. Теория и применение цифровой обработки сигналов /Пер. с англ. А.Л.Зайцева, Э.Г.Назаренко, Н.Н.Тетекина; Под ред. Ю.Н.Александрова. - М.:Мир, 1978. - 848 с.