离散余弦变换,DCT for Discrete Cosine Transform。
是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transform),但是只使用实数。
离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的(因为一个实偶函数的傅里叶变换仍然是一个实偶函数),在有些变形里面需要将输入或者输出的位置移动半个单位(DCT有8种标准类型,其中4种是常见的)。

离散余弦变换DCT具有信号谱分量丰富、能量集中,且不需要对语音相位进行估算等优点,能在较低的运算复杂度下取得较好的语音增强效果。

离散余弦变换,尤其是它的第二种类型,经常被信号处理和图像处理使用,用于对信号和图像(包括静止图像和运动图像)进行有损数据压缩。这是由于离散余弦变换具有很强的"能量集中"特性:大多数的自然信号(包括声音和图像)的能量都集中在离散余弦变换后的低频部分;

在mpeg协议或jpeg格式的编码中包含离散余弦变换,记不太清,可以自己查;

下面来看C语言实现;

#include <windows.h>
#include <math.h>
#include "resource.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst;
TCHAR szClassName[] = TEXT("dctDemo");
#define PI 3.141593
#define N 4void dct(int x[4], HDC ); int WINAPI
WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
{HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_DCTDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("离散余弦变换 Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,300,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam;
}LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;RECT rt;    char szBuffer[100]; int x1[] = {2,3,3,2};switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_dct:        hdc=GetDC(hwnd);dct(x1,hdc);break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("dctDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("离散余弦变换Demo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam);               }break;case WM_CREATE:break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);                 GetClientRect(hwnd, &rt);               EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0;
}void dct(int x[4], HDC hdc)
{int row=0;char szBuffer[20];int k,n;double A,s,X[4];for(k = 0; k < N; k++){s = 0;if(k==0)A = sqrt(1.0/N); //计算k=0时的系数elseA = sqrt(2.0/N); //计算k!=0时的系数for(n = 0; n < N; n++){double tmp = x[n]*cos((PI*(2*n+1)*k)/(2*N));s = s + tmp;  //累加求和}X[k] = A * s;   //X[k]等于累和结果s乘以系数A}for(k = 0; k < N; k++)  {sprintf(szBuffer,"%.7lf",X[k]);TextOut(hdc,10,10+row*25,szBuffer,lstrlen(szBuffer));row=row+1;}}

这是计算4个点的DCT;要计算的值序列作为数组传给DCT函数;然后输出;

控制台的版本输出如下;

控制台版本代码;

#include<stdio.h>
#include<math.h>
#define PI 3.141593
#define N 4
int main()
{int k, n;int x[] = {2,3,3,2};double A, s, X[4];for(k = 0; k < N; k++){s = 0;if(k==0)A = sqrt(1.0/N); //计算k=0时的系数elseA = sqrt(2.0/N); //计算k!=0时的系数for(n = 0; n < N; n++){double tmp = x[n]*cos((PI*(2*n+1)*k)/(2*N));s = s + tmp;   //累加求和}X[k] = A * s;   //X[k]等于累和结果s乘以系数A}for(k = 0; k < N; k++)  printf("%f\n", X[k]);
}

输出的时候如果小数点格式化不对就会出现问题;正确的应该是,

sprintf(szBuffer,"%.6lf",X[k]);

工程;

资源和头文件;

#include "resource.h"
#include <windows.h>/
//
// Menu
//IDC_DCTDEMO MENU
BEGINPOPUP "&File"BEGINMENUITEM "离散余弦变换Demo",                   IDM_dctMENUITEM "E&xit",                  IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...",             IDM_ABOUTEND
END
#define  IDM_EXIT        10001
#define     IDM_ABOUT       10002#define    IDC_DCTDEMO     10101
#define     IDD_ABOUTBOX    10102
#define     IDM_dct         40001

离散余弦变换和C语言实现-win32版本相关推荐

  1. C语言实现离散余弦变换(DCT)并用MATLAB和Python验证

    概念 离散余弦变换(Discrete Cosine Transform,DCT)是可分离的变换,其变换核为余弦函数.是与傅里叶变换相关的一种变换,它相当于把离散傅里叶变换的虚数部分丢掉,只使用实数.D ...

  2. 二维离散余弦变换(DCT)与二维离散反余弦变换(IDCT)C语言实现

    二维离散余弦变换(DCT)与二维离散反余弦变换(IDCT)C语言实现 实验目标 对一个8x8的矩阵进行DCT和IDCT然后在观察前者和后者的变化 实验准备 理论基础 二维离散余弦变换 F ( u , ...

  3. 二维离散变换由c语言编写,离散余弦变换(DCT)的DSP程序设计与实现

    <离散余弦变换(DCT)的DSP程序设计与实现>由会员分享,可在线阅读,更多相关<离散余弦变换(DCT)的DSP程序设计与实现(15页珍藏版)>请在人人文库网上搜索. 1.DS ...

  4. 二维离散变换由c语言编写,C++实现离散余弦变换(参数为二维指针)(示例代码)...

    http://www.cnblogs.com/scut-linmaojiang/p/5013590.html 写在前面 到目前为止已经阅读了相当一部分的网格水印等方面的论文了,但是论文的实现进度还没有 ...

  5. dct余弦离散c语言,DCT离散余弦变换的DSP实现.doc

    DCT离散余弦变换的DSP实现 学生姓名: 指导老师: TMS320VC5402的特性,以运用TMS320VC5402定点DSP芯片完成MPEG-4标准中DCT系数量化为例,简要介绍MPEG-4标准的 ...

  6. DCT(离散余弦变换(DiscreteCosineTransform))

    离散余弦变换(Discrete Cosine Transform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算.在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项 ...

  7. c语言最新版,【整理】C语言的各种版本:C89,AMD1,C99,C11 – 在路上

    [背景] 之前就知道了有个C90和C99. 后来又在: 期间知道有C11. 现在去整理一下,关于C语言的版本方面的更详细的内容. 参考内容: C语言版本历史 C语言主要有三个版本: ANSI C==C ...

  8. 【 MATLAB 】逆离散余弦变换(idct)的基础知识介绍

    基础知识介绍 逆离散余弦变换从离散余弦变换 (DCT) 系数中重建序列.idct 函数是 dct 函数的逆. The DCT has four standard variants. For a tra ...

  9. JPEG压缩原理与DCT离散余弦变换 量化

    原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 1 前言 JPEG是joint Photographic Experts Gr ...

最新文章

  1. 最全面的百度地图JavaScript离线版开发
  2. ActiveMQ消息队列的使用及应用
  3. 树莓派400键盘计算机发布!全新的电路板布局,更快,更酷!
  4. Seq2Seq之双向解码机制 | 附开源实现
  5. Python如何将列表分成均匀大小的块?
  6. 习题7.10 使用割线法求解方程
  7. mac新建react脚手架
  8. 马云将于阿里巴巴功成身退?
  9. pip3 install tesserocr安装失败
  10. Life is not fair, get used to it.
  11. mysql -prompt选项
  12. 免校准的电量计量芯片_应物联网而生:合力为HLW8012系列免校准电能计量芯片-测试测量-与非网...
  13. 正态分布某一点的概率怎么算_标准正态分布+标准正态分布概率表+分布函数+积分...
  14. FastDFS安装手册
  15. samba文件共享服务器拒绝访问,Samba共享文件夹拒绝访问
  16. python平方的代码怎么写,Python编程之求数字平方代码实例
  17. 狂神说Java---java学习笔记(图片有些问题,有时间将图片从电脑上传上来)
  18. BenchmarkSQL对mysql进行性能测试
  19. 2022年全国职业技能大赛网络安全竞赛试题B模块自己解析思路(5)
  20. 基于java(springboot)网吧管理系统(java毕业设计)

热门文章

  1. 汉诺塔的改编题(用栈求解,分别递归和非递归)
  2. Redis的常用命令——set的常用命令
  3. 开发期间模板引擎页面修改以后,要实时生效 || 登陆成功,防止表单重复提交,可以重定向||只有登录之后才能访问相关的页面
  4. Spring Boot与Web开发简介||SpringBoot对静态资源的映射规则
  5. Service 和 doGet 和 doPost 方法的区别
  6. Spring Boot错误处理机制以及定制自己的错误页面
  7. c# 学习笔记 (2) 窗体之间互相调用的方法
  8. LDO和DC-DC的区别
  9. opencv 图像阈值分割图像
  10. MPI派生数据类型发送接收,降低发送时间