Завдання
Варіант № 12
Розрахувати параметри виконання алгоритму ШПФ з такими вхідними даними:
Кількість точок
2048
Основа ШПФ
2
Прорідження
часове
Частота роботи процесора
12,0 МГц
Розрядність вхідних даних
24(12+12)
Тип вхідного інтерфейсу
SPORT
Тип вихідного інтерфейсу
Зовнішня пам'ять
Зміст
Вступ 5
1 Теоретичний розділ 6
1.1 Опис швидкого перетворення Фур’є з прорідженням в часі 6
2 Аналіз (розробка) блок-схеми виконання заданої функції обробки сигналів та зображень на заданому типі процесора 9
3 Розрахунковий розділ 11
4 Розробка функціональної схеми 13
5 Розробка програми виконання алгоритму ШПФ 15
Висновки 19
Література 20
2 Аналіз (розробка) блок-схеми виконання заданої функції обробки сигналів та зображень на заданому типі процесора
Табл.2.1. Двійково-інверсна перестановка даних
Номер
Двійкове представлення
Двійкова інверсія
Двійково-інверсний номер
0
0000
0000
0
1
0001
1000
8
2
0010
0100
4
3
0011
1100
12
4
0100
0010
2
5
0101
1010
10
6
0110
0110
6
7
0111
1110
14
8
1000
0001
1
9
1001
1001
9
10
1010
0101
5
11
1011
1101
13
…
…
…
…
2045
11111111101
10111111111
1535
2046
11111111110
01111111111
1023
2047
11111111111
11111111111
2047
/
Рис.2.1 Блок-схема алгоритму 2048-точкового перетворення за основою 2
/
Рис.2.2 Граф 2048-точкового ШПФ за основою 2 з прорідженням по часу
3 Розрахунковий розділ
12
2048
2
Т
12,0
24 (12+12)
SPORT
Зовнішня пам'ять
Частота роботи процесора: , звідси цикл виконання команди: .
base – основа базової операції «метелик»;
N – к-ть точок вх. перетворення;
base=2; N=2048;
– кількість етапів перетворення;
– кількість базових операцій «метелик» на одному етапі;
– кількість базових операцій у всьому перетворенні;
;
;
Для виконання базової операції «метелик» необхідно:
4 операцій множення;
6 операцій додавання;
10 операцій читання з пам`яті:
- 2*2=4 (для читання дійсної та уявної частини вхідних відліків);
- 3*2=6 (для читання дійсної та уявної частини комплексних коефіцієнтів);
4 операцій запису:
- 2*2=4 (для запису дійсної та уявної частини вхідних відліків);
В результаті на одну базову операцію припадає 24 операцій: Nна 1 мет=24 (оп).
Тривалість виконання обчислення ШПФ:
Тривалість надходження даних у процесор для обробки(SPORT):
– такт надходження даних;
Тривалість виходу даних із процесору (Зовнішня пам'ять):
Твих=21нс;
Тривалість надходження даних у процессор, виходу із нього та тривалість обчислення ШПФ:
4 Розробка функціональної схеми
/
Рис.4.1 Фунціональна схема
5 Розробка програми виконання алгоритму ШПФ
Структуру програми, що виконує обчислення за алгоритмом ШПФ можна уявити наступним чином:
/
Рис.5.1. Узагальнена блок-схема алгоритму
Кожен з трьох циклів призначений для правильного визначення номеру відліку в конкретний момент обчислення. Перший цикл визначає номер ярусу, другий – номер базової операції у ярусі, третій – номер відліку у базовій операції.
Вводиться масив, що зберігає відліки, в програмі названий matrix, його номер відповідно – N (кількість точок перетворення). Кожен елемент масиву – комплексне число. Інший массив W призначений для зберігання повертаючи множників. На кожну базову операцію припадає 3 повертаючих множника (четвертий фактично дорівнює 1), тому його розмір:
11*2048*3=67584 (11 – кількість ярусів, 2048 – кількість базових операцій в ярусі). Елемент цього масиву є так само комплексним числом.
Текст програми, написаної на мові С, поданий нижче
N=2048;
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*2048+p*3+1].re –
- matrix[x3+i].im*W[n*2048+p*3+1].im +
+ matrix[x2+i].re*W[n*2048+p*3+0].re –
- matrix[x2+i].im*W[n*2048+p*3+0].im +
+ matrix[x4+i].re*W[n*2048+p*3+2].re –
- matrix[x4+i].im*W[n*2048+p*3+2].im;
temp1.im=
matrix[x1+i].im + matrix[x3+i].re*W[n*2048+p*3+1].im +
+ matrix[x3+i].im*W[n*2048+p*3+1].re +
+ matrix[x2+i].re*W[n*2048+p*3+0].im +
+ matrix[x2+i].im*W[n*2048+p*3+0].re +
+ matrix[x4+i].re*W[n*2048+p*3+2].im +
+ matrix[x4+i].im*W[n*2048+p*3+2].re;
temp2.re=
matrix[x1+i].re - matrix[x3+i].re*W[n*2048+p*3+1].re +
+ matrix[x3+i].im*W[n*2048+p*3+1].im +
+ matrix[x2+i].re*W[n*2048+p*3+0].im +
+ matrix[x2+i].im*W[n*2048+p*3+0].re -
- matrix[x4+i].re*W[n*2048+p*3+2].im –
- matrix[x4+i].im*W[n*2048+p*3+2].re;
temp2.im=
matrix[x1+i].im - matrix[x3+i].re*W[n*2048+p*3+1].im -
- matrix[x3+i].im*W[n*2048+p*3+1].re -
- matrix[x2+i].re*W[n*2048+p*3+0].re +
+ matrix[x2+i].im*W[n*2048+p*3+0].im -
- matrix[x4+i].re*W[n*2048+p*3+2].re +
+ matrix[x4+i].im*W[n*2048+p*3+2].im;
temp3.re=
matrix[x1+i].re + matrix[x3+i].re*W[n*2048+p*3+1].re –
- matrix[x3+i].im*W[n*2048+p*3+1].im -
- matrix[x2+i].re*W[n*2048+p*3+0].re +
+ matrix[x2+i].im*W[n*2048+p*3+0].im +
+ matrix[x4+i].re*W[n*2048+p*3+2].re –
- matrix[x4+i].im*W[n*2048+p*3+2].im;
temp3.im=
matrix[x1+i].im + matrix[x3+i].re*W[n*2048+p*3+1].im +
+ matrix[x3+i].im*W[n*2048+p*3+1].re -
- matrix[x2+i].re*W[n*2048+p*3+0].im -
- matrix[x2+i].im*W[n*2048+p*3+0].re +
+ matrix[x4+i].re*W[n*2048+p*3+2].im +
+ matrix[x4+i].im*W[n*2048+p*3+2].re;
temp4.re=
matrix[x1+i].re - matrix[x3+i].re*W[n*2048+p*3+1].re +
+ matrix[x3+i].im*W[n*2048+p*3+1].im -
- matrix[x2+i].re*W[n*2048+p*3+0].im –
- matrix[x2+i].im*W[n*2048+p*3+0].re -
- matrix[x4+i].re*W[n*2048+p*3+2].re +
+ matrix[x4+i].im*W[n*2048+p*3+2].im;
temp4.im=
matrix[x1+i].im - matrix[x3+i].re*W[n*2048+p*3+1].im -
- matrix[x3+i].im*W[n*2048+p*3+1].re +
+ matrix[x2+i].re*W[n*2048+p*3+0].re -
- matrix[x2+i].im*W[n*2048+p*3+0].im -
- matrix[x4+i].re*W[n*2048+p*3+2].re +
+ matrix[x4+i].im*W[n*2048+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, 512, 256,128, 64,32, 16,8, 4, 2, 1. На першому ярусі є 1024 груп операцій по 2 відліка кожна, на другому – 512 груп.
Організація змінної j передбачає, що вона буде вибирати групу відліків для базової операції, спираючись на неї визначаються їх адреси змінними х1, х2, х3, х4. Ці адреси зміщуються за певним законом для кожної групи відліків, використовуючи третій цикл, що обробляю вже безпосередньо групу.
Змінні temp1, temp2, temp3, temp4 – зберігають тимчасові значення результатів обчислення. Значення f та p визначають адресу повертаю чого множника для даної базової операції.