Розрахунок параметрів виконання алгоритму ШПФ

Інформація про навчальний заклад

ВУЗ:
Ужгородський національний університет
Інститут:
Не вказано
Факультет:
Інженерно технічний
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Розрахункова робота
Предмет:
Теоретичні основи комп ютерної безпеки

Частина тексту файла (без зображень, графіків і формул):

ДЕРЖАВНИЙ ВИЩИЙ НАВЧАЛЬНИЙ ЗАКЛАД «УЖГОРОДСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ» Інженерно-технічний факультет Кафедра копм’ютерних систем та мереж Розрахунково-графічна робота з дисципліни «Теоретичні основи цифрової обробки сигналів» на тему: «Розрахунок параметрів виконання алгоритму ШПФ» студент IV-го курсу КСМ, ІТФ Бобуський Перевірив: Ваврук Є. Я. Ужгород-2012 Завдання Варіант № 3. Розрахувати параметри виконання алгоритму ШПФ з такими вхідними даними: Кількість точок 4096  Основа ШПФ 4  Прорідження часове  Частота роботи процесора 2,8 МГц  Розрядність вхідних даних 12  Тип вхідного інтерфейсу SPORT  Тип вихідного інтерфейсу PCI   Анотація В даній розрахунково-графічній роботі розглянуто спосіб реалізації алгоритму ШПФ за основою 4 з часовим прорідженням, описано механізми обчислення швидкого перетворення Фур`є з прорідженням в часі, аналіз блок-схеми виконання заданої функції обробки сигналів та зображень на заданому типі процесора. В роботі також обчислено часові ресурси для виконання обчислення, створена функціональна схема системи та написана програма виконання заданої функції. Зміст Вступ 5 1 Теоретичний розділ 6 1.1 Опис швидкого перетворення Фур’є з прорідженням в часі 6 1.2 Приклад виконання для 1024-точкового перетворення за основою 4 12 2 Аналіз (розробка) блок-схеми виконання заданої функції обробки сигналів та зображень на заданому типі процесора 15 3 Розрахунковий розділ 17 4 Розробка функціональної схем 18 5 Розробка програми виконання заданої функції 20 Висновки 24 Література 25 Вступ Перетворення Фур'є - це функція, що описує амплітуду та фазу кожної синусоїда, що відповідає певній частоті. Амплітуда представляє висоту кривої, а фаза - початкову точку синусоїда. Ці перетворення зворотні, при чому зворотнє перетворення має практично таку ж саму форму, що й пряме перетворення. Швидке перетворення Фур'є застосовується в багатьох галузях: радіолокации, стисненні відео та зображень, геології. Багато з цих задач вимагають виконання перетворень в реальному часі, з мінімальною часовою затримкою обчислень. Для зменшення часу, необхідного для виконання перетворень, можливо розпаралелювання задачі, виконання її на паралельній обчислювальній системі. Крім того, ці перетворення корисні при проектуванні фільтрів. Частотна характеристика фільтра може бути отримана за допомогою перетворення Фур’є його імпульсної реакції. І навпаки, якщо визначена частотна характеристика сигналу, то необхідна імпульсна реакція може бути отримана за допомогою зворотнього перетворення Фур’є над його частотною характеристикою. Цифрові фільтри можуть бути створені на основі їхньої імпульсної реакції, оскільки коефіцієнти фільтра з кінцевою імпульсною характеристикою (КІХ) ідентичні дискретній імпульсній реакції фільтра. 1 Теоретичний розділ 1.1 Опис швидкого перетворення Фур’є з прорідженням в часі Дискретний матеріальний сигнал у вигляді кінцевої часової послідовності x(nТ) запишемо як x(nТ), де  - число відліків, N – число відліків, T - період дискретизації. N - точкове дискретне перетворення Фур'є (ДПФ) задається формулою:  де X(k) - частотний k-ий відлік чи k-а спектральна складова сигналу (визначає вихідну частотну послідовність, спектр сигналу),  комплексна експонента, W- ядро перетворення. При зміні значення n*k на величину кратну N ядро не змінюється (у силу періодичності синуса і косинуса). Тобто ядро по верхньому індексу є періодичною функцією з періодом N. Тому замість добутку n*k можна вставити залишок від ділення його на N , тобто (n*k) mod N. Cпектральна функція X(k) також має період N по аргументу k. Число множень дійсних відліків сигналу на комплексне ядро в (1) дорівнює N2, а число додавань комплексних чисел - (N -1)N. Кількість цих операцій різко зростає із збільшенням N і приводить до занадто великого часу перетворення. ДПФ стало широко застосовуватися після винаходу швидких алгоритмів, в основі яких лежить принцип зведення багатоточкового перетворення до малоточкового. Один з них (що став уже класичним) називається ШПФ із проріджу-ванням за часом. Цей алгоритм отриманий за умови, якщо N є ступенем числа 2, тобто , де ν - ціле число, ν≥0. Основні формули перетворення, до яких ми прийдемо, виходять при розбивці суми в (1) на дві суми, що містять відліки з парними і непарними номерами  Власне кажучи ця операція являє собою зміну порядку сумування (перегрупу-вання доданків), від якого сума не міняється. Можна записати , . З врахуванням цього (2) прийме вигляд:  Зауважимо, що суми в (3) являють собою N/2 - точкові ДПФ часових відліків з парними номерами в першій сумі, і непарними номерами в другій сумі. Позначимо, згідно з [1], X(k) = Xν(k) - ДПФ усіх  вхідних відліків дискретного сигналу,  вхідних відліків з парними номерами (перше число в нижньому індексі дорівнює ν - 1, а друге - парному числу (нулю)) ,  вхідних відліків з непарними номерами (друге число в нижньому індексі дорівнює непарному числу (одиниці)). З урахуванням введених позначень одержимо коротку форму запису (3)  Спектри і  є періодичними функціями з періодом N/2 (у ядрі перетворення замість N стоїть N/2). Величина  називається повертаючим множником і володіє наступною цікавою властивістю  Ця властивість надає при обчисленні  з номерами k від N/2 до (N -1) використовувати відповідні значення раніше обчислених  з номерами від 0 до (N/2 -1) (потрібно тільки змінити знак). За звичай формулу (4) розбивають на два співвідношення для зазначених вище номерів і одержують основні формули (базові співвідношення) перетворення Фур'є у вигляді  Базові співвідношення вже можна назвати швидким перетворенням Фур'є (ШПФ), тому що число операцій зменшилося. Число множень матеріальних відліків сигналу на комплексне ядро дорівнює . До цього потрібно додати  множень комплексних чисел. Число додавань дорівнює  Процес розбиття за схемою базових співвідношень можна продовжувати до тих пір, доки не прийдемо до перетворень Фур'є одиничних відліків (що збігаються із самими відліками). Необхідне число операцій при цьому буде значно менше. У такому вигляді це ШПФ називають ШПФ із проріджуванням за часом. Для пояснення процесу розбиття розглянемо більш детально, приклад ШПФ при . Позначимо оператор ДПФ визначених вхідних відліків через F і запишемо відповідності між символами ДПФ, введеними вище, і цим оператором.   Зв'язок між ДПФ із великим і меншим числом точок відповідно до базових співвідношень записується в такий спосіб:   Роботу ШПФ можна пояснити графічно, якщо базові співвідношення, записані в дуже короткій формі  або зобразити графом  Верхній стрілці відповідає додавання, а нижній - віднімання. Попередньо bm-1 домножається на множник повороту WN. Використовуючи вищенаведене і розташовуючи символи ДПФ у впорядковано-му вигляді, зобразимо ШПФ геометрично за допомогою графа.  Рис.1.1. Граф ШПФ із проріджуванням за часом при N=8 Відзначимо, що відліки вхідної послідовності переходять у відповідні ДПФ нульового рівня відповідно до інверсії їхній двійкових номерів (операція називається перестановкою вхідних відліків). Наприклад, десятковий номер 4|10 у двійковому вигляді запишеться як 100|2. Інверсія числа 100|2 (у прочитанні з права на ліво) запишеться як 001|2 = 1|10. Таким чином, вхідний відлік під номером 4 співпаде з першим ДПФ X0,1(0). Перестановку для всіх відліків можна показати стрілками переходу: 0 → 0, 1 → 4, 2 → 2, 3 → 6, 4 → 1, 5→ 5, 6 → 3, 7 → 7. 1.2.Алгоритм перетворення Алгоритм ШПФ можна скласти, спираючи на граф ШПФ при N=8. Зауважимо, що ДПФ з однаковим числом точок на графі розташовані у вигляді стовпців. Пронумеруємо ДПФ у кожнім стовпці цифрами від 0 до 7 (від 0 до N-1 у загальному випадку) зверху вниз. Вихідні значення ДПФ - комплексні числа, які можна зберігати у деякому масиві. Перехід відповідно до базових співвідношень від ДПФ попереднього стовпця до ДПФ із подвоєним числом точок наступного стовпця назвемо кроком перетворення. З огляду на послідовний характер кроків перетворення, вихідні значення ДПФ кожного стовпця можна зберігати в тому самому масиві (це повинен бути масив комплексних чисел). Остаточно масив буде містити результуючі значення ШПФ. Графи базових співвідношень на кожнім кроці візуально групуються. Групи складаються з окремих графів чи декількох графів, що перетинаються між собою. У прикладі на першому кроці графа є 4 групи, у другому – 2 і на третьому - 1. Введемо позначення: - число відліків сигналу, що обробляється, чи число точок перетворення; v - число кроків перетворення; step - номер кроку, step = 0,..., v - 1; group - номер групи графів, group = 0, ..., (group_max - 1), де group_max - число груп (залежить від номера кроку); іnput - номер ДПФ, вихід якого з'єднаний з верхнім входом графа базового співвідношення; іnput +add - номер ДПФ, вихід якого з'єднаний з нижнім входом цього графа; add - різниця відповідних номерів; pow - ступінь множника повороту (у тексті pow відповідає показнику k в ) . Змінні зв'язані між собою в такий спосіб:  Ці співвідношення отримані при аналізі графа ШПФ. Для приведеного графа побудована таблиця, у якій для кожного кроку перетворення занесені індекси і їхні межі зміни, що використані в циклах програми. Нижче приведений алгоритм програми. Його особливість - результат виходить у масиві вхідних даних. Алгоритм побудований для випадку комплексних вхідних даних, як більш загальний випадок. Табл.1.  2 Практичний розділ Табл.2. Порядок слідування відліків для кожного ярусу I II III IV V VI  0 0 0 0 0 0  1024 256 64 16 4 1  2048 512 128 32 8 2  3072 768 192 48 12 3  1 1 1 1 1 4  1025 257 65 17 5 5  2049 513 129 33 9 6  3073 769 193 49 13 7  2 2 2 2 2 8  1026 258 66 18 6 9  2050 514 130 34 10 10  3074 770 194 50 14 11  3 3 3 3 3 12  1027 259 67 19 7 13  2051 515 131 35 11 14  3075 771 195 51 15 15  4 4 4 4 17 16  1028 260 68 20 21 17  2052 516 132 36 25 18  3076 772 196 52 29 19  ...  1022 3326 3902 4046 4082 4091  2046 3582 3966 4062 4086 4092  3070 3838 4030 4078 4090 4093  4094 4094 4094 4094 4094 4094  1023 3327 3903 4047 4083 4092  2047 3583 3967 4063 4087 4093  3071 3839 4031 4079 4091 4094  4095 4095 4095 4095 4095 4095  2.1. Побудова графа алгоритму ШПФ з основою 2 Для побудови графу N-точкового ШПФ з основою 4 потрібно визначити кількість ярусів (Nяр) графу та кількості метеликів (Nм) на кожному ярусі таким чином: Nяр = Log4N, для N=4096, Log44096 = 6; Nм = N/2 = 4096/4= 1024. Граф-алгоритм для 64 точкового ШПФ за основою 4 показаний на рис. 2.1.  Рис.2..1. Граф 64-точкового ШПФ за основою 4 з прорідженням по часу 2.2. Блок-схема перетворення  Рис.2.2. Блок-схема алгоритму 4096-точкового перетворення за основою 4 3 Розрахунковий розділ Частота роботи процесора: , звідси цикл виконання команди: . base – основа базової операції «метелик»; N – кількість точок вхідного перетворення; base=4; N=4096;  – кількість етапів перетворення;  – кількість базових операцій «метелик» на одному етапі;  – кількість базових операцій у всьому перетворенні;    Для виконання базової операції «метелик» необхідно: 12 операцій множення; 22 операцій додавання; 14 операцій читання з пам`яті: - 4*2=8 (для читання дійсної та уявної частини вхідних відліків); - 3*2=6 (для читання дійсної та уявної частини комплексних коефіцієнтів); 8 операцій запису: - 4*2=8 (для запису дійсної та уявної частини вхідних відліків); В результаті на одну базову операцію припадає 56 операцій: Nна 1 мет=56 (оп) Тривалість виконання обчислення ШПФ:  Частота роботи порту SPORT f=8 КГц. Звідси тривалість надходження даних у процесор для обробки:  – такт надходження даних;  Частота роботи PCI шини: , звідси цикл виходу команди: . Тривалість виходу даних з процесора: Твих=7,519*12 = 90.228 нс – такт виходу даних;  Тривалість надходження даних у процессор, виходу із нього та тривалість обчислення ШПФ:  4 Розробка функціональної схеми  Рис.4. Фунціональна схема SPORT- (serial port, послідовний порт) — двонаправлений послідовний інтерфейс, призначений для обміну байтовою інформацією. Послідовний тому, що інформація через нього передається по одному біту, біт за бітом (на відміну від паралельного порту). Найчастіше для послідовного порту персональних комп'ютерів використовується стандарт RS-232c. Раніше послідовний порт використовувався для підключення терміналу, пізніше для модему або миші. Зараз він використовується для з'єднання зджерелами безперебійного живлення, для зв'язку з апаратними засобами обчислювальних систем. Хоча деякі інші інтерфейси комп'ютера — такі як Ethernet, Firewire і USB — також використовують послідовний спосіб обміну, назва «Послідовний порт» закріпилася за портом, що має стандарт Rs-232c. Найчастіше використовуються Д-подібні роз'єми: 9- і 25-контактні (DB-9 і DB-25 відповідно). Раніше використовувалися також DB-31 і круглі восьмиконтактні DIN-8. Максимальна швидкість передачі зазвичай складає 115200 біт/с. Важливою особливістю інтерфейсної системи послідовного порту є те, що вона може передавати дані в послідовному режимі від пристрою і в паралельному від шини. Взаємне перетворення послідовних та паралельних форматів даних виконується із допомогою регістрів зсуву, що мають функцію паралельного доступу 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. Узагальнена блок-схема алгоритму Кожен з трьох циклів призначений для правильного визначення номеру відліку в конкретний момент обчислення. Перший цикл визначає номер ярусу, другий – номер базової операції у ярусі, третій – номер відліку у базовій операції. Вводиться масив, що зберігає відліки, в програмі названий matrix, його номер відповідно – N (кількість точок перетворення). Кожен елемент массиву – комплексне число. Інший массив W призначений для зберігання повертаючи множників. На кожну базову операцію припадає 3 повертаючих множника (четвертий фактично дорівнює 1), тому його розмір: 6*4096*3=73728 (6 - кількість ярусів, 4096 - кількість базових операцій в ярусі). Елемент цього масиву є так само комплексним числом. Текст програми, написаної на мові С, поданий нижче N=4096; 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*4096+p*3+1].re – - matrix[x3+i].im*W[n*4096+p*3+1].im + + matrix[x2+i].re*W[n*4096+p*3+0].re – - matrix[x2+i].im*W[n*4096+p*3+0].im + + matrix[x4+i].re*W[n*4096+p*3+2].re – - matrix[x4+i].im*W[n*4096+p*3+2].im; temp1.im= matrix[x1+i].im + matrix[x3+i].re*W[n*4096+p*3+1].im + + matrix[x3+i].im*W[n*4096+p*3+1].re + + matrix[x2+i].re*W[n*4096+p*3+0].im + + matrix[x2+i].im*W[n*4096+p*3+0].re + + matrix[x4+i].re*W[n*4096+p*3+2].im + + matrix[x4+i].im*W[n*4096+p*3+2].re; temp2.re= matrix[x1+i].re - matrix[x3+i].re*W[n*4096+p*3+1].re + + matrix[x3+i].im*W[n*4096+p*3+1].im + + matrix[x2+i].re*W[n*4096+p*3+0].im + + matrix[x2+i].im*W[n*4096+p*3+0].re - - matrix[x4+i].re*W[n*4096+p*3+2].im – - matrix[x4+i].im*W[n*4096+p*3+2].re; temp2.im= matrix[x1+i].im - matrix[x3+i].re*W[n*4096+p*3+1].im - - matrix[x3+i].im*W[n*4096+p*3+1].re - - matrix[x2+i].re*W[n*4096+p*3+0].re + + matrix[x2+i].im*W[n*4096+p*3+0].im - - matrix[x4+i].re*W[n*4096+p*3+2].re + + matrix[x4+i].im*W[n*4096+p*3+2].im; temp3.re= matrix[x1+i].re + matrix[x3+i].re*W[n*4096+p*3+1].re – - matrix[x3+i].im*W[n*4096+p*3+1].im - - matrix[x2+i].re*W[n*4096+p*3+0].re + + matrix[x2+i].im*W[n*4096+p*3+0].im + + matrix[x4+i].re*W[n*4096+p*3+2].re – - matrix[x4+i].im*W[n*4096+p*3+2].im; temp3.im= matrix[x1+i].im + matrix[x3+i].re*W[n*4096+p*3+1].im + + matrix[x3+i].im*W[n*4096+p*3+1].re - - matrix[x2+i].re*W[n*4096+p*3+0].im - - matrix[x2+i].im*W[n*4096+p*3+0].re + + matrix[x4+i].re*W[n*4096+p*3+2].im + + matrix[x4+i].im*W[n*4096+p*3+2].re; temp4.re= matrix[x1+i].re - matrix[x3+i].re*W[n*4096+p*3+1].re + + matrix[x3+i].im*W[n*4096+p*3+1].im - - matrix[x2+i].re*W[n*4096+p*3+0].im – - matrix[x2+i].im*W[n*4096+p*3+0].re - - matrix[x4+i].re*W[n*4096+p*3+2].re + + matrix[x4+i].im*W[n*4096+p*3+2].im; temp4.im= matrix[x1+i].im - matrix[x3+i].re*W[n*4096+p*3+1].im - - matrix[x3+i].im*W[n*4096+p*3+1].re + + matrix[x2+i].re*W[n*4096+p*3+0].re - - matrix[x2+i].im*W[n*4096+p*3+0].im - - matrix[x4+i].re*W[n*4096+p*3+2].re + + matrix[x4+i].im*W[n*4096+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++; } Значення imax+1 означає кількість груп, по яких проводиться збірка на конкретному ярусі і приймає значення: 1024, 265, 64, 16, 4, 1. На першому ярусі є 1024 групи операцій по 4 відліка кожна, на другому – 256 груп і збірка ведеться по 16 відліків і т.д. Організація змінної j передбачає, що вона буде вибирати групу відліків для базової операції, спираючись на неї визначаються їх адреси змінними х1, х2, х3, х4. Ці адреси зміщуються за певним законом для кожної групи відліків, використовуючи третій цикл, що обробляю вже безпосередньо групу. Змінні temp1, temp2, temp3, temp4 – зберігають тимчасові значення результатів обчислення. Значення f та p визначають адресу повертаю чого множника для даної базової операції. Висновки Під час виконання розрахунково-графічної роботи було розглянуто приклад реалізації обчислювальної системи, в основі якої лежить алгоритм швидкого перетворення Фур’є за основою 4. Дана система обробляє вхідний сигнал, що є 12-розрядним і надходить з тактом, який дорівнює 6.144с. Вхідні дані оновлюються і представляються 16-ма вхідними відліками, що містять дійсну та уявну частину. В результаті набуто досвід у проектуванні обчислювальної системи, розглянуто основні компоненти, з яких вона складається, засвоєно алгоритми, на основі яких виконується обчислення. Література Цифровые фильтры и устройства обработи сигналов на интегральных микросхемах: Справочное пособие/Ф.Б.Высоцкий, В.И. Алексеев, В.П. Пачин и др.; Под ред. Б.Ф.Высоцкого.-М.: Радио и связь, 1984.-216с. Куприянов М. С., Матюшкин Б. Д. Цифровая обработка сигналов: процессоры, алгоритмы, средства проектирования. – Спб. : Политехника, 1998. Бабак В.П., Хандецький А.І., Шрюфер Е. Обробка сигналів: підручник для вузів., К., Либідь, 1996.- 390с. Мельник А.А. Проектирование поточного процессора БПФ на специализированных БИС.- Львов, 1990.- 43с. Применение цифровой обработки сигналов/ Под ред. Э.Оппенгейма.- М. Мир, 1980.- 552с. Справочник по устройствам цифровой обработки информации/ Н.А.Виноградов, В.Н.Яковлев, В.В.Воскресенский и др.- К:Тэхника, 1988.- 455с. Шрюфер Е. Обробка сигналів. Цифрова обробка дискретизованих сигналів.- К.: Либідь, 1992.- 226с. Рабинер Л., Гоулд Б. Теория и применение цифровой обработки сигналов /Пер. с англ. А.Л.Зайцева, Э.Г.Назаренко, Н.Н.Тетекина; Под ред. Ю.Н.Александрова. - М.:Мир, 1978. - 848 с.
Антиботан аватар за замовчуванням

24.03.2013 21:03-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!