数据压缩 实验四 DPCM压缩系统的实现和分析

数据压缩【实验四】DPCM压缩系统的实现和分析 目录DPCM编码原理算法实现输出结果压缩质量分析压缩PSNR峰值信噪比原理算法 DPCM编码 原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。 在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法: 阅读详情

实验原理

这里写图片描述

DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器虚线框中所示。

DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。
在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。

代码分析

main.cpp

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<Windows.h>
#include<math.h>
#include"DPCM.h"
#define u_int8_t    unsigned __int8
#define u_int       unsigned __int32
#define u_int32_t   unsigned __int32

BITMAPFILEHEADER File_header;
BITMAPINFOHEADER Info_header;

int main(int argc, char** argv)
{   
    bool flip = FALSE;                  //BMP图像倒序存储数据 需要翻转

    char* bmpFileName = NULL;           //输入
    char* yuvFileName = NULL;           //输出
    char* deviationFileName = NULL;     //误差
    char* rebuildFileName = NULL;       //重建
    FILE* bmpFile = NULL;
    FILE* yuvFile = NULL;
    FILE* deviationFile = NULL;
    FILE* rebuildFile = NULL;

    u_int8_t* rgbBuf = NULL;
    u_int8_t* yBuf = NULL;
    u_int8_t* uBuf = NULL;
    u_int8_t* vBuf = NULL;
    u_int8_t* deviationBuf = NULL;
    u_int8_t* rebuildBuf = NULL;

    u_int frameWidth, frameHeight;      //宽高
    int i = 0, j = 0;

    bmpFileName = argv[1];              //输入
    yuvFileName = argv[2];              //输出
    deviationFileName = argv[3];        //误差
    rebuildFileName = argv[4];          //重建

    /////read files/////
    bmpFile = fopen(bmpFileName, "rb");
    if (bmpFile == NULL)
    {
        printf("cannot find bmp file\n");
        exit(1);
    }
    else
    {
        printf("The input bmp file is %s\n", bmpFileName);
    }

    yuvFile = fopen(yuvFileName, "wb");
    if (yuvFile == NULL)
    {
        printf("cannot find yuv file\n");
        exit(1);
    }
    else
    {
        printf("The output yuv file is %s\n", yuvFileName);
    }

    deviationFile = fopen(deviationFileName, "wb");
    if (deviationFile == NULL)
    {
        printf("cannot find deviation file\n");
        exit(1);
    }
    else
    {
        printf("The output deviation file is %s\n", deviationFileName);
    }

    rebuildFile = fopen(rebuildFileName, "wb");
    if (rebuildFile == NULL)
    {
        printf("cannot find rebuild file\n");
        exit(1);
    }
    else
    {
        printf("The output rebuild file is %s\n", rebuildFileName);
    }
    printf("\n");
    /////read BMP fileheader & infoheader/////
    if (fread(&File_header, sizeof(BITMAPFILEHEADER), 1, bmpFile) != 1)
    {
        printf("read file header error!");
        exit(0);
    }
    if (File_header.bfType != 0x4D42)
    {
        printf("Not bmp file!");
        exit(0);
    }
    else
    {
        printf("this is a bmp file.\n");
    }
    if (fread(&Info_header, sizeof(BITMAPINFOHEADER), 1, bmpFile) != 1)
    {
        printf("read info header error!");
        exit(0);
    }
    printf("bitcount==%d\n", (unsigned char)Info_header.biBitCount);
    /////end read header/////

    frameWidth = Info_header.biWidth;               //宽高赋值
    frameHeight = Info_header.biHeight;

    /////开缓存区/////
    rgbBuf = (u_int8_t *)malloc(sizeof(u_int8_t)*frameHeight*frameWidth * 3);
    memset(rgbBuf, 0, frameHeight*frameWidth * 3);
    yBuf = (u_int8_t*)malloc(sizeof(u_int8_t)*frameHeight*frameWidth);
    uBuf = (u_int8_t*)malloc(sizeof(u_int8_t)*frameHeight*frameWidth / 4);
    vBuf = (u_int8_t*)malloc(sizeof(u_int8_t)*frameHeight*frameWidth / 4);
    deviationBuf = (u_int8_t*)malloc(sizeof(u_int8_t)*frameHeight*frameWidth);
    rebuildBuf = (u_int8_t*)malloc(sizeof(u_int8_t)*frameHeight*frameWidth);

    ReadRGB(rgbBuf, bmpFile, File_header, Info_header);
    if (RGB2YUV(frameWidth, frameHeight, rgbBuf, yBuf, uBuf, vBuf, flip))
    {
        printf("Color transferring failed");
        return 0;
    }

    printf("framewidth==%d,frameheight==%d.\n", frameWidth, frameHeight);       //输出图像宽高

    DO_DPCM(yBuf, deviationBuf, rebuildBuf,frameWidth,frameHeight);                 //进行DPCM编码

    fwrite(yBuf, 1, frameWidth * frameHeight, yuvFile);                         //写输出文件
    fwrite(deviationBuf, 1, frameHeight*frameWidth, deviationFile);
    fwrite(rebuildBuf, 1, frameHeight*frameWidth, rebuildFile);

    /////关缓存/////
    if (rgbBuf != NULL) 
        free(rgbBuf);
    if (yBuf != NULL) 
        free(yBuf);
    if (uBuf != NULL) 
        free(uBuf);
    if (vBuf != NULL) 
        free(vBuf);
    if (deviationBuf != NULL) 
        free(deviationBuf);
    if (rebuildBuf != NULL) 
        free(rebuildBuf);
    /////关文件/////
    if (bmpFile != NULL) 
        fclose(bmpFile);
    if (yuvFile != NULL) 
        fclose(yuvFile);
    if(deviationFile != NULL) 
        fclose(deviationFile);
    if(rebuildFile != NULL) 
        fclose(rebuildFile);

    system("pause");
    return 0;
}

DPCM.cpp

#include<Windows.h>
#include<stdio.h>
#include<math.h>
#include"DPCM.h"
static float RGBYUV02990[256], RGBYUV05870[256], RGBYUV01140[256];
static float RGBYUV01684[256], RGBYUV03316[256];
static float RGBYUV04187[256], RGBYUV00813[256];

bool MakePalette(FILE * pFile, BITMAPFILEHEADER &file_h, BITMAPINFOHEADER & info_h, RGBQUAD *pRGB_out)
{
    /*若图像开始位置与INFOHEADER结束处位置,还有pow(2, info_h.biBitCount)个
    结构体RGBQUAQ的空间(颜色数为2的biBitCount次方,调色板为数组),则说明
    该bmp图像有调色板。*/
    if ((file_h.bfOffBits - sizeof(BITMAPFILEHEADER) - info_h.biSize) == sizeof(RGBQUAD)*pow(2.0, info_h.biBitCount))
    {
        fseek(pFile, sizeof(BITMAPFILEHEADER) + info_h.biSize, 0);
        fread(pRGB_out, sizeof(RGBQUAD), (unsigned int)pow(2.0, info_h.biBitCount), pFile);
        return true;
    }
    else
        return false;
}

void ReadRGB(unsigned char * rgbbuf, FILE *bmpfile, BITMAPFILEHEADER &file_h, BITMAPINFOHEADER & info_h)
{
    u_int Width = 0, Height = 0;
    long Loop = 0;
    unsigned char *bmpbuf = NULL;
    unsigned char *rgb = NULL;
    unsigned char mask = 0;
    int deltaw = 0;
    rgb = rgbbuf;

    if (((info_h.biWidth  * info_h.biBitCount / 8) % 4) == 0)
        Width = info_h.biWidth*info_h.biBitCount / 8;
    else
        Width = (info_h.biWidth  * info_h.biBitCount + 31) / 32 * 4;

    if ((info_h.biHeight % 2) == 0)
        Height = info_h.biHeight;
    else
        Height = info_h.biHeight + 1;

    deltaw = Width - info_h.biWidth * info_h.biBitCount / 8;
    bmpbuf = (unsigned char *)malloc(sizeof(unsigned char)*Height*Width);
    printf("word_width :%d , word_height: %d \n", Width, Height);
    RGBQUAD *pRGB = (RGBQUAD *)malloc(sizeof(RGBQUAD) * (unsigned int)pow(2.0, (double)info_h.biBitCount));

    if (!MakePalette(bmpfile, file_h, info_h, pRGB))
    {
        printf("No palette!\n");                        //没有调色板
    }

    fread(bmpbuf, 1, Height*Width, bmpfile);
    if (info_h.biBitCount == 24)                        //24位bmp
    {
        for (Loop = 0; Loop<Height*Width; Loop++)
        {
            if (deltaw != 0)
            {
                if (deltaw == 1)
                {
                    if ((Loop + 1) % Width == 0)
                        continue;
                }
                else if (deltaw == 2)
                {
                    if ((Loop + 1) % Width == 0 || (Loop + 2) % Width == 0)
                        continue;
                }
                else
                {
                    if ((Loop + 1) % Width == 0 || (Loop + 2) % Width == 0 || (Loop + 3) % Width == 0)
                        continue;
                }
            }
            *rgb = *(bmpbuf + Loop);
            rgb++;
        }
    }
    else if (info_h.biBitCount == 16)                   //16位bmp
    {
        for (Loop = 0; Loop < Height * Width; Loop += 2)
        {
            *rgb = (bmpbuf[Loop] & 0x1F) << 3;
            *(rgb + 1) = ((bmpbuf[Loop] & 0xE0) >> 2) + ((bmpbuf[Loop + 1] & 0x03) << 6);
            *(rgb + 2) = (bmpbuf[Loop + 1] & 0x7C) << 1;
            rgb += 3;
        }
    }
    else if (info_h.biBitCount == 32)                   //32位bmp
    {
        for (Loop = 0; Loop < info_h.biWidth*info_h.biHeight; Loop++)
        {
            *(rgb + 3 * Loop) = *(bmpbuf + 4 * Loop);
            *(rgb + 3 * Loop + 1) = *(bmpbuf + 4 * Loop + 1);
            *(rgb + 3 * Loop + 2) = *(bmpbuf + 4 * Loop + 2);
        }
    }
    else                                                //其他位bmp
    {
        for (Loop = 0; Loop < Height*Width; Loop++)
        {
            if (deltaw != 0)
            {
                if (deltaw == 1)
                {
                    if ((Loop + 1) % Width == 0)
                        continue;
                }
                else if (deltaw == 2)
                {
                    if ((Loop + 1) % Width == 0 || (Loop + 2) % Width == 0)
                        continue;
                }
                else
                {
                    if ((Loop + 1) % Width == 0 || (Loop + 2) % Width == 0 || (Loop + 3) % Width == 0)
                        continue;
                }
            }
            switch (info_h.biBitCount)                  //蒙版
            {
            case 1:
                mask = 0x80;                            //10000000
                break;
            case 2:
                mask = 0xC0;                            //11000000
                break;
            case 4:
                mask = 0xF0;                            //11110000
                break;
            case 8:
                mask = 0xFF;                            //11111111
                break;
            }
            int shiftCnt = 1;
            while (mask)
            {
                /*根据从数据中提取出的索引号index,以index为调色板数组下标去查询
                数据中每info_h.biBitCount位所代表的颜色。
                while 循环的次数:
                1bit 图像 每字节循环8次
                2bit 图像 每字节循环4次
                4bit 图像 每字节循环2次
                8bit 图像 每字节循环1次。
                */
                unsigned char index =
                    mask == 0xFF ? bmpbuf[Loop] : ((bmpbuf[Loop] & mask) >> (8 - shiftCnt *info_h.biBitCount));
                *rgb = pRGB[index].rgbBlue;
                *(rgb + 1) = pRGB[index].rgbGreen;
                *(rgb + 2) = pRGB[index].rgbRed;
                if (info_h.biBitCount == 8) mask = 0;
                else    mask >>= info_h.biBitCount;
                rgb += 3;
                shiftCnt++;
            }
        }
    }
    if (pRGB != NULL) 
        free(pRGB);
    if (bmpbuf != NULL)
        free(bmpbuf);
}

int RGB2YUV(int x_dim, int y_dim, void *bmp, void *y_out, void *u_out, void *v_out, int flip)
{
    static int init_done = 0;

    long i, j, size;
    float yf, uf, vf;
    unsigned char *r, *g, *b;
    unsigned char *y, *u, *v;
    unsigned char *pu1, *pu2, *pv1, *pv2, *psu, *psv;
    unsigned char *y_buffer, *u_buffer, *v_buffer;
    unsigned char *sub_u_buf, *sub_v_buf;

    if (init_done == 0)
    {
        InitLookupTable();
        init_done = 1;
    }

    if ((x_dim % 2) || (y_dim % 2)) return 1;
    size = x_dim * y_dim;

    y_buffer = (unsigned char *)y_out;
    sub_u_buf = (unsigned char *)u_out;
    sub_v_buf = (unsigned char *)v_out;
    u_buffer = (unsigned char *)malloc(size * sizeof(unsigned char));
    v_buffer = (unsigned char *)malloc(size * sizeof(unsigned char));
    if (!(u_buffer && v_buffer))
    {
        if (u_buffer) free(u_buffer);
        if (v_buffer) free(v_buffer);
        return 2;
    }

    b = (unsigned char *)bmp;
    y = y_buffer;
    u = u_buffer;
    v = v_buffer;

    /////RGB to YUV/////
    if (!flip) 
    {
        for (j = 0; j < y_dim; j++)
        {
            y = y_buffer + (y_dim - j - 1) * x_dim;
            u = u_buffer + (y_dim - j - 1) * x_dim;
            v = v_buffer + (y_dim - j - 1) * x_dim;

            for (i = 0; i < x_dim; i++) {
                g = b + 1;
                r = b + 2;
                yf = (RGBYUV02990[*r] + RGBYUV05870[*g] + RGBYUV01140[*b]);
                uf = (-RGBYUV01684[*r] - RGBYUV03316[*g] + (*b) / 2 + 128);
                vf = ((*r) / 2 - RGBYUV04187[*g] - RGBYUV00813[*b] + 128);
                *y = (unsigned char)(yf>16 ? (yf>235 ? 235 : (unsigned char)yf) : 16);
                *u = (unsigned char)(uf>16 ? (uf>240 ? 240 : (unsigned char)uf) : 16);
                *v = (unsigned char)(vf>16 ? (vf>240 ? 240 : (unsigned char)vf) : 16);
                b += 3;
                y++;
                u++;
                v++;
            }
        }
    }
    else 
    {
        for (i = 0; i < size; i++)
        {
            g = b + 1;
            r = b + 2;
            *y = (unsigned char)(RGBYUV02990[*r] + RGBYUV05870[*g] + RGBYUV01140[*b]);
            *u = (unsigned char)(-RGBYUV01684[*r] - RGBYUV03316[*g] + (*b) / 2 + 128);
            *v = (unsigned char)((*r) / 2 - RGBYUV04187[*g] - RGBYUV00813[*b] + 128);
            b += 3;
            y++;
            u++;
            v++;
        }
    }

    for (j = 0; j < y_dim / 2; j++)
    {
        psu = sub_u_buf + j * x_dim / 2;
        psv = sub_v_buf + j * x_dim / 2;
        pu1 = u_buffer + 2 * j * x_dim;
        pu2 = u_buffer + (2 * j + 1) * x_dim;
        pv1 = v_buffer + 2 * j * x_dim;
        pv2 = v_buffer + (2 * j + 1) * x_dim;
        for (i = 0; i < x_dim / 2; i++)
        {
            *psu = (*pu1 + *(pu1 + 1) + *pu2 + *(pu2 + 1)) / 4;
            *psv = (*pv1 + *(pv1 + 1) + *pv2 + *(pv2 + 1)) / 4;
            psu++;
            psv++;
            pu1 += 2;
            pu2 += 2;
            pv1 += 2;
            pv2 += 2;
        }
    }

    free(u_buffer);
    free(v_buffer);

    return 0;
}

void InitLookupTable()
{
    int i;

    for (i = 0; i < 256; i++) RGBYUV02990[i] = (float)0.2990 * i;
    for (i = 0; i < 256; i++) RGBYUV05870[i] = (float)0.5870 * i;
    for (i = 0; i < 256; i++) RGBYUV01140[i] = (float)0.1140 * i;
    for (i = 0; i < 256; i++) RGBYUV01684[i] = (float)0.1684 * i;
    for (i = 0; i < 256; i++) RGBYUV03316[i] = (float)0.3316 * i;
    for (i = 0; i < 256; i++) RGBYUV04187[i] = (float)0.4187 * i;
    for (i = 0; i < 256; i++) RGBYUV00813[i] = (float)0.0813 * i;
}

void DO_DPCM(void * yBuf, void * deviationBuf, void *rebuildBuf, unsigned int width, unsigned int height)
{
    unsigned char *ybuffer = NULL;
    unsigned char *deviationbuffer = NULL;
    unsigned char *rebuildbuffer = NULL;
    int deviation = 0;
    int i = 0, j = 0;

    ybuffer = (unsigned char *)yBuf;                    //原始图像缓冲区
    deviationbuffer = (unsigned char *)deviationBuf;    //误差图像缓冲区
    rebuildbuffer = (unsigned char *)rebuildBuf;        //重建图像缓冲区

    for (i = 0; i < height; i++)
    {
        for (j = 0; j < width; j++)
        {
            /*256级的灰度图像,预测值范围为[-255,255],
            8bit量化则除以2,将预测值范围变为[-127,127],
            再加128后可转到正常灰度显示
            */
            if (j == 0)//对第一个像素进行误差预测
            {
                deviation = (*ybuffer - 128)/2+128;//量化后的预测误差
                *deviationbuffer = (unsigned char)deviation;

                deviation = (*deviationbuffer - 128)*2+128;//反量化后的预测误差
                *rebuildbuffer = (unsigned char)deviation;

                ybuffer++;
                deviationbuffer++;
                rebuildbuffer++;
            }
            else//对其余像素进行误差预测
            {
                deviation = (*ybuffer - *(rebuildbuffer-1))/2+128;//量化后的预测误差
                *deviationbuffer = (unsigned char)deviation;

                deviation = (*deviationbuffer - 128)*2 + *(rebuildbuffer - 1);//反量化后的预测误差
                *rebuildbuffer = (unsigned char)deviation;

                ybuffer++;
                deviationbuffer++;
                rebuildbuffer++;
            }
        }
    }
}
原图像预测误差图像重建图像原图像概率分布预测误差图像概率分布

压缩性能比较:

文件名称源文件大小(KB)huffman变换(KB)压缩比DPCM+huffman变换(KB)压缩比
birds.bmp3843041.261482.59
lena.bmp64531.20371.73
camman.bmp64501.28341.88

  预测误差图像都为明显的灰色,电平集中分布在128附近,量化过程中将量化误差抬升128电平所以表明实际预测误差值集中分布在 0 左右,证明对于正常图像,相邻像素之间存在很强的关联性,利用相关性对像素量化后进行压缩压缩比会很理想。

数据压缩实验四:DPCM 压缩系统的实现和分析 一:实验原理 1.DCPM编码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。DCPM编码是对模拟信号幅度抽样的差值进行量化编码的调制方式,这种方式是用已经过去的抽样值来预测当前的抽样值,对它们的差值进行编码。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码 阅读详情

相关推荐

数据压缩实验四——DPCM压缩系统的实现和分析

文章目录一、实验原理二、实验步骤1.读入2.DPCM3.计算概率3.计算PSNR三、实验结果 一、实验原理 DPCM是差分预测编码调制的缩写,本次实验采用固定预测器和均匀量化器,预测器采用前向预测。其中xn为输入信号,Q为量化器,dn=pn+xn为预测误差,P为延时器。 大致算法步骤如下: 读取一个256级的灰度图像,与前一个像素作差得到预测误差,范围为[-255,255]。 需要将其范围转变为计算机可以表示的范围,先转变为单极性,即加上255,范围变为[0,510]。 进行8bit均匀量化。 二、实验

m0_52405563的博客 277

DPCM 压缩系统的实现和分析

DPCM 压缩系统的实现和分析一. DPCM编解码1. 原理2. 注意事项二. DPCM编码器1. 代码实现2. 图像展示3. 概率分布图三. 仅进行熵编码 PK DPCM+熵编码1. 压缩比2. 压缩图像质量-PSNR四. 总结 一. DPCM编解码 1. 原理 预测编码:利用信源相邻符合之间的相关性 ➢ 根据某一模型利用以往的样本值对新样本进行预测,然后将样本的实际值与其预测值相减得到一个误差值,最后对这一误差值进行编码。 ➢ 如果模型足够好,且样本序列在时间上相关性较强,则误差信号的幅度将远远小于原始

qq_43850979的博客 425

数据压缩实验四|DPCM 压缩系统的实现和分析

“数据压缩原理与应用 A”实验指导书(四) 一、实验课程编码:103050 二、实验课程名称:数据压缩原理与应用 A 三、实验项目名称:DPCM 压缩系统的实现和分析 四、实验目的 掌握DPCM编解码系统的基本原理。初步掌握实验用C/C++/Python等语言编程实现DPCM 编码器,并分析其压缩效率。 五、主要设备 安装 Windows 和 Visual Studio 软件的个人计算机 六、实验内容 1.DPCM编解码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中, 需

m0_55764256的博客 283

实验四:DPCM 压缩系统的实现和分析

实验原理   DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中, 需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是 因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实 际内嵌了一个解码器,如编码器中虚线框中所示。   在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器 和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和 量化器的优化设计。 DPCM编解码原理图 实验内

CUC_ENGINEER的博客 555

数据压缩原理与应用 实验四 DPCM 压缩系统的实现和分析

一、基本原理1.预测编码预测编码利用信源相邻符号之间的相关性,根据某一模型利用以往的样本值对新样本进行预测,然后将样本的实际值与其预测值相减得到一个误差值,最后对这一误差值进行编码。 如果模型足够好,且样本序列在时间上相关性较强,则误差信号的幅度将远远小于原始信号,从而得到较大的数据压缩。2.DPCM基本原理DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是

ttsss99的博客 719

dpcm算法研究 语音压缩编码算法:差分脉冲编码调制算法的实现

差分脉冲编码调制算法研究 : 用Matlab实现DPCM算法 ,文件包括源码、运行结果分析、实验问报告文档。该文件演示了DPCM压缩文件和对文件进行解压缩的过程以及一些参数的分析,含有详细注释。

数据压缩实验四 DPCM 压缩系统的实现和分析

DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。掌握DPCM编解码系统的基本原理。初步掌握实验用C语言编程实现DPCM编码器并分析 其压缩效率。

Alfred512的博客 1298

DPCM的基本原理,DPCM就是通过预测和差分编码方式来减少冗余,实现数据压缩的目的

DPCM的基本原理 任何信号,不论语音或图像,采用直接采样-量化-编码的方式进行编码,都会发现码组之间具有很强的相关性。由于相关性的存在,传输数据中存在大量不需要传输的信息,称为冗余。 DPCM就是通过预测和差分编码方式来减少冗余,实现数据压缩的目的。

【数据压缩】实验四——DPCM 压缩系统的实现和分析

DCMP编码

weixin_49587657的博客 390

DPCM 压缩系统的实现和分析 数据压缩实验4

DPCM 压缩系统的实现和分析,掌握DPCM编解码系统的基本原理。初步掌握实验用C语言编程实现DPCM编码器并分析其压缩效率。

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 324

数据压缩 实验四 DPCM 压缩系统的实现和分析

DPCM 压缩系统的实现和分析 DPCM编解码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。DPCM是用以往的样本值来预测当前样本值,将样本的实际值与预测值相减得到误差值,对这一误差值编码。在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示,由它可以输出带有误差的预测值。在一个DPCM系统中,有两个因素需要设计:预测器P和量化器Q。 实现算法 在本次实验中,采用固定预测器和均匀量化器。预测器采用左侧预测,量化器对预测误差采用8比特均匀量化。 命令参数 er.yuv为误差图像

CurtiaYu的博客 298

ConnectionResetError 10054 根因分析与全链路防御指南

ConnectionResetError(错误码10054)是TCP协议中服务端主动发送RST包导致的强制断连,本质并非网络连接失败,而是服务端基于空闲超时、连接满载、TLS协商失败等策略做出的确定性终止决策。理解其底层原理有助于跳出‘重试’误区,转向连接生命周期管理。该错误高频出现在HTTP长连接、WebSocket、第三方API对接等场景,尤其在Nginx反向代理、负载均衡器(如AWS ALB)、WAF设备及内核conntrack机制下极易触发。本文结合Wireshark抓包分析、客户端心跳保鲜、协议指

weixin_30225755的博客 639

数据压缩实验四:DPCM压缩系统的实现和分析

DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。在一个DPCM系统中,有两个因素需要设计预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法分别进行线性预测器和量化器的优化设计。......

qq_51210935的博客 477

Unity接入Google登录:Credential Manager完整集成指南与避坑实践

在移动应用开发中,第三方登录是提升用户体验和降低注册门槛的关键技术。其核心原理是通过OAuth 2.0等授权协议,安全地获取用户在平台的身份凭证。对于面向海外市场的Unity应用,Google登录因其庞大的用户基数成为首选方案。然而,随着Android系统更新和隐私政策收紧,传统的WebView登录方式面临兼容性挑战。Credential Manager作为Google推出的现代化凭据管理API,通过系统级集成解决了这一问题,它统一了密码、通行密钥和第三方登录的调用接口,显著提升了登录成功率和原生体验。在U

weixin_28025327的博客 320

10|Git Diff 与增量代码识别:本次到底改了哪些代码?

本文介绍 Git Diff 和增量代码识别,帮助你理解精准测试如何先找到本次真正变化的代码。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 160

数据压缩原理 实验四 DPCM压缩系统的实现和分析

数据压缩原理 实验四 DPCM压缩系统的实现和分析

liu_yuchang的博客 670

【AN7581】AN7581 SDK编译环境搭建操作说明

安装编译需要的工具包。

wgl307293845的博客 338
上一篇: 数据压缩 实验三 Huffman编解码算法实现与压缩效率分析
下一篇: 数据压缩 实验五 JPEG原理分析JPEG解码器的调试
MayNine
博客等级 码龄10年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值