关于DCT8x8 CUDA样本的问题

关于DCT8x8 CUDA样本的问题,cuda,nvidia,dct,Cuda,Nvidia,Dct,我对Nvidia提供的名为DCT8x8的示例有疑问,该示例应用于图像以并行执行算法。更多信息: 代码在BMP图像上执行正向DCT和反向DCT 我的第一个问题是,是否有一种方法可以计算出只有前向变换才能获得JPG 其次,代码中有几个部分我不理解,我希望熟悉DTC和CUDA的人能帮我解决这些问题 第一:在文件dtc8x8_gold.cpp中,程序使用以下矩阵: const float DCTv8matrix[BLOCK_SIZE2] = { 0.3535533905932738f, 0.490392

我对Nvidia提供的名为DCT8x8的示例有疑问,该示例应用于图像以并行执行算法。更多信息:

代码在BMP图像上执行正向DCT和反向DCT

我的第一个问题是,是否有一种方法可以计算出只有前向变换才能获得JPG

其次,代码中有几个部分我不理解,我希望熟悉DTC和CUDA的人能帮我解决这些问题

第一:在文件dtc8x8_gold.cpp中,程序使用以下矩阵:

const float DCTv8matrix[BLOCK_SIZE2] =
{
0.3535533905932738f, 0.4903926402016152f, 0.4619397662556434f, 0.4157348061512726f, 0.3535533905932738f, 0.2777851165098011f, 0.1913417161825449f, 0.0975451610080642f,
0.3535533905932738f, 0.4157348061512726f, 0.1913417161825449f, -0.0975451610080641f, -0.3535533905932737f, -0.4903926402016152f, -0.4619397662556434f, -0.2777851165098011f,
0.3535533905932738f, 0.2777851165098011f, -0.1913417161825449f, -0.4903926402016152f, -0.3535533905932738f, 0.0975451610080642f, 0.4619397662556433f, 0.4157348061512727f,
0.3535533905932738f, 0.0975451610080642f, -0.4619397662556434f, -0.2777851165098011f, 0.3535533905932737f, 0.4157348061512727f, -0.1913417161825450f, -0.4903926402016153f,
0.3535533905932738f, -0.0975451610080641f, -0.4619397662556434f, 0.2777851165098009f, 0.3535533905932738f, -0.4157348061512726f, -0.1913417161825453f, 0.4903926402016152f,
0.3535533905932738f, -0.2777851165098010f, -0.1913417161825452f, 0.4903926402016153f, -0.3535533905932733f, -0.0975451610080649f, 0.4619397662556437f, -0.4157348061512720f,
0.3535533905932738f, -0.4157348061512727f, 0.1913417161825450f, 0.0975451610080640f, -0.3535533905932736f, 0.4903926402016152f, -0.4619397662556435f, 0.2777851165098022f,
0.3535533905932738f, -0.4903926402016152f, 0.4619397662556433f, -0.4157348061512721f, 0.3535533905932733f, -0.2777851165098008f, 0.1913417161825431f, -0.0975451610080625f
};

const float DCTv8matrixT[BLOCK_SIZE2] =
{
0.3535533905932738f, 0.3535533905932738f, 0.3535533905932738f, 0.3535533905932738f, 0.3535533905932738f, 0.3535533905932738f, 0.3535533905932738f, 0.3535533905932738f,
0.4903926402016152f, 0.4157348061512726f, 0.2777851165098011f, 0.0975451610080642f, -0.0975451610080641f, -0.2777851165098010f, -0.4157348061512727f, -0.4903926402016152f,
0.4619397662556434f, 0.1913417161825449f, -0.1913417161825449f, -0.4619397662556434f, -0.4619397662556434f, -0.1913417161825452f, 0.1913417161825450f, 0.4619397662556433f,
0.4157348061512726f, -0.0975451610080641f, -0.4903926402016152f, -0.2777851165098011f, 0.2777851165098009f, 0.4903926402016153f, 0.0975451610080640f, -0.4157348061512721f,
0.3535533905932738f, -0.3535533905932737f, -0.3535533905932738f, 0.3535533905932737f, 0.3535533905932738f, -0.3535533905932733f, -0.3535533905932736f, 0.3535533905932733f,
0.2777851165098011f, -0.4903926402016152f, 0.0975451610080642f, 0.4157348061512727f, -0.4157348061512726f, -0.0975451610080649f, 0.4903926402016152f, -0.2777851165098008f,
0.1913417161825449f, -0.4619397662556434f, 0.4619397662556433f, -0.1913417161825450f, -0.1913417161825453f, 0.4619397662556437f, -0.4619397662556435f, 0.1913417161825431f,
0.0975451610080642f, -0.2777851165098011f, 0.4157348061512727f, -0.4903926402016153f, 0.4903926402016152f, -0.4157348061512720f, 0.2777851165098022f, -0.0975451610080625f
};

float Q[BLOCK_SIZE2] =
{
32.f, 33.f, 51.f, 81.f, 66.f, 39.f, 34.f, 17.f,
33.f, 36.f, 48.f, 47.f, 28.f, 23.f, 12.f, 12.f,
51.f, 48.f, 47.f, 28.f, 23.f, 12.f, 12.f, 12.f,
81.f, 47.f, 28.f, 23.f, 12.f, 12.f, 12.f, 12.f,
66.f, 28.f, 23.f, 12.f, 12.f, 12.f, 12.f, 12.f,
39.f, 23.f, 12.f, 12.f, 12.f, 12.f, 12.f, 12.f,
34.f, 12.f, 12.f, 12.f, 12.f, 12.f, 12.f, 12.f,
17.f, 12.f, 12.f, 12.f, 12.f, 12.f, 12.f, 12.f
};

float C_a = 1.387039845322148f; //!< a = (2^0.5) * cos( pi / 16); Used in forward and inverse DCT.
float C_b = 1.306562964876377f; //!< b = (2^0.5) * cos( pi / 8); Used in forward and inverse DCT.
float C_c = 1.175875602419359f; //!< c = (2^0.5) * cos(3 * pi / 16); Used in forward and inverse DCT.
float C_d = 0.785694958387102f; //!< d = (2^0.5) * cos(5 * pi / 16); Used in forward and inverse DCT.
float C_e = 0.541196100146197f; //!< e = (2^0.5) * cos(3 * pi / 8); Used in forward and inverse DCT.
float C_f = 0.275899379282943f; //!< f = (2^0.5) * cos(7 * pi / 16); Used in forward and inverse DCT.
最后一个问题是,, 我觉得这些值是为“barbara.bmp”图像指定的,如果是真的,我就不会使用与defaul图像不同的图像,这就是我想要做的,除了理解代码之外

非常感谢你的帮助

Saul

根据输入数据元素在数据集中的位置,将其乘以余弦项。这些余弦项可以针对n的各种值预先计算,即针对数据集中的各种位置

第一个矩阵(
DCTv8matrix
)表示一组余弦项计算。请注意,所有值都位于-1和1(余弦函数的范围)之间

第二个矩阵(
DCTv8matrixT
)只是第一个矩阵的转置

第三和第四个矩阵(
float Q[BLOCK_SIZE2]
\uuu constant\uuuu short Q[]
)是量化因子的浮点和整数表示。为了实现压缩,JPEG编码中使用的方法之一是“丢弃”由DCT产生的结果变换数据中的某些“频率分量”。这些矩阵用于帮助量化2D变换数据中的某些“频率分量”。较低的“频率分量”表示在左上角,较高的“频率分量”表示在右下角。量化因子的具体选择由JPEG算法的设计者(或实现者)决定,以在保持真实图像的同时实现压缩

在这种情况下,最大量化发生在最高“频率”处

通常选择的量化因子对于特定图像不是唯一的。您应该能够在其他图像上使用这些因素并获得合理的结果

尽管这个例子完成了与编码(和解码)相关的大部分工作,但我不认为以JPEG格式存储中间结果是一件小事。仍然需要创建一个例程,将适当的JPEG头(例如JFIF头)写入文件,然后按照适当的顺序写入适当的量化数据

__constant__ short Q[] =
{
32, 33, 51, 81, 66, 39, 34, 17,
33, 36, 48, 47, 28, 23, 12, 12,
51, 48, 47, 28, 23, 12, 12, 12,
81, 47, 28, 23, 12, 12, 12, 12,
66, 28, 23, 12, 12, 12, 12, 12,
39, 23, 12, 12, 12, 12, 12, 12,
34, 12, 12, 12, 12, 12, 12, 12,
17, 12, 12, 12, 12, 12, 12, 12
};