Diskret kosinus konvertatsiyasi (DCT) har xil chastotalarda tebranuvchi kosinus funktsiyalarining yig'indisi nuqtai nazaridan ma'lumotlar nuqtalarining cheklangan ketma -ketligini ifodalaydi. Birinchi bo'lib 1972 yilda Nosir Ahmad tomonidan taklif qilingan DCT signallarni qayta ishlash va ma'lumotlarni siqishda keng qo'llaniladigan transformatsiya usuli hisoblanadi. Raqamli tasvirlar (JPEG va HEIF kabi kichik chastotali komponentlar tashlanishi mumkin bo'lgan), raqamli video (MPEG va H.26x kabi), raqamli audio (Dolby Digital, MP3 kabi) kabi raqamli axborot vositalarining ko'pchiligida ishlatiladi. va AAC), raqamli televidenie (SDTV, HDTV va VOD kabi), raqamli radio (AAC+ va DAB+ kabi) va nutqni kodlash (AAC-LD, Siren va Opus kabi). DCT -lar, shuningdek, raqamli signallarni qayta ishlash, telekommunikatsiya asboblari, tarmoqli o'tkazish qobiliyatini qisqartirish va qisman differentsial tenglamalarni sonli hal qilish uchun spektral usullar kabi fan va texnikada qo'llaniladigan boshqa ko'plab ilovalar uchun ham muhim ahamiyatga ega.
Sinus funktsiyalaridan ko'ra kosinusdan foydalanish siqilish uchun juda muhim, chunki ma'lumki (pastda tasvirlangan) odatiy signalni taxmin qilish uchun kosinus funktsiyalarining kamroq bo'lishi kerak, differentsial tenglamalar uchun esa kosinuslar chegara shartlarining ma'lum tanlovini bildiradi. Xususan, DCT-bu Fourier bilan bog'liq bo'lgan diskret Fourier transformatsiyasiga (DFT) o'xshash, lekin faqat haqiqiy sonlardan foydalangan holda o'zgartirish. DCTlar, odatda, davriy va nosimmetrik kengaytirilgan ketma -ketlikdagi Fourier seriyali koeffitsientlari bilan, DFTlar esa faqat vaqti -vaqti bilan kengaytirilgan ketma -ketlikdagi Fourier seriyali koeffitsientlari bilan bog'liq. DCTlar simmetriya bilan haqiqiy ma'lumotlarda ishlaydigan uzunlikdan taxminan ikki barobar uzunlikdagi DFTga teng (chunki haqiqiy va hatto funktsiyaning Furye konvertatsiyasi haqiqiy va hatto), ba'zi variantlarda kirish va/yoki chiqish ma'lumotlari yarmiga siljiydi. namuna. Sakkizta standart DCT variantlari mavjud, ulardan to'rttasi keng tarqalgan.
Diskret kosinus konvertatsiyasining eng keng tarqalgan varianti-II DCT turi, uni odatda "DCT" deb atashadi. Bu Ahmad tomonidan birinchi marta taklif qilingan asl DCT edi. Uning teskari turi-III DCT mos ravishda ko'pincha "teskari DCT" yoki "IDCT" deb nomlanadi. Tegishli ikkita transformatsiya - bu aniq va toq funktsiyalar DFT ga teng bo'lgan diskret sinusli transformatsiya (DST) va bir -biriga mos keladigan ma'lumotlar DCT ga asoslangan o'zgartirilgan diskret kosinus transformatsiyasi (MDCT). Ko'p o'lchovli DCT (MD DCTs) DCT tushunchasini MD signallariga kengaytirish uchun ishlab chiqilgan. MD DCT ni hisoblash uchun bir nechta algoritmlar mavjud. DCTni bajarishning hisoblash murakkabligini kamaytirish uchun turli xil tezkor algoritmlar ishlab chiqilgan. Ulardan biri-DCT [1] (IntDCT) tamsayı, bir nechta ISO/IEC va ITU-T xalqaro standartlarida qo'llaniladigan standart DCT [2] butun sonli yaqinlashuvi. [2] [1]
DCT -ni siqish, shuningdek bloklarni siqish deb ataladi, ma'lumotlarni alohida DCT bloklari to'plamlarida siqadi. [3] DCT bloklari bir qator o'lchamlarga ega bo'lishi mumkin, shu jumladan standart DCT uchun 8x8 piksel va 4x4 dan 32x32 pikselgacha bo'lgan DCT ning har xil o'lchamlari. [1] [4] DCT kuchli "energiyani siqish" xususiyatiga ega, [5] [6] yuqori ma'lumotlarni siqish nisbatlarida yuqori sifatga erisha oladi. [7] [8] Biroq, og'ir DCT siqish qo'llanilganda, blokli siqilish artefaktlari paydo bo'lishi mumkin.
DCT algoritmi :
// CPP program to perform discrete cosine transform
#include
using namespace std;
#define pi 3.142857
const int m = 8, n = 8;
// Function to find discrete cosine transform and print it
int dctTransform(int matrix[][n])
{
int i, j, k, l;
// dct will store the discrete cosine transform
float dct[m][n];
float ci, cj, dct1, sum;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
// ci and cj depends on frequency as well as
// number of row and columns of specified matrix
if (i == 0)
ci = 1 / sqrt(m);
else
ci = sqrt(2) / sqrt(m);
if (j == 0)
cj = 1 / sqrt(n);
else
cj = sqrt(2) / sqrt(n);
// sum will temporarily store the sum of
// cosine signals
sum = 0;
for (k = 0; k < m; k++) {
for (l = 0; l < n; l++) {
dct1 = matrix[k][l] *
cos((2 * k + 1) * i * pi / (2 * m)) *
cos((2 * l + 1) * j * pi / (2 * n));
sum = sum + dct1;
}
}
dct[i][j] = ci * cj * sum;
}
}
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%f\t", dct[i][j]);
}
printf("\n");
}
}
// Driver code
int main()
{
ios :: sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int matrix[m][n] = { { 255, 255, 255, 255, 255, 255, 255, 255 },
{ 255, 255, 255, 255, 255, 255, 255, 255 },
{ 255, 255, 255, 255, 255, 255, 255, 255 },
{ 255, 255, 255, 255, 255, 255, 255, 255 },
{ 255, 255, 255, 255, 255, 255, 255, 255 },
{ 255, 255, 255, 255, 255, 255, 255, 255 },
{ 255, 255, 255, 255, 255, 255, 255, 255 },
{ 255, 255, 255, 255, 255, 255, 255, 255 } };
dctTransform(matrix);
return 0;
}
Natija:
Do'stlaringiz bilan baham: |