离散余弦变换和C语言实现-win32版本
离散余弦变换,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版本相关推荐
- C语言实现离散余弦变换(DCT)并用MATLAB和Python验证
概念 离散余弦变换(Discrete Cosine Transform,DCT)是可分离的变换,其变换核为余弦函数.是与傅里叶变换相关的一种变换,它相当于把离散傅里叶变换的虚数部分丢掉,只使用实数.D ...
- 二维离散余弦变换(DCT)与二维离散反余弦变换(IDCT)C语言实现
二维离散余弦变换(DCT)与二维离散反余弦变换(IDCT)C语言实现 实验目标 对一个8x8的矩阵进行DCT和IDCT然后在观察前者和后者的变化 实验准备 理论基础 二维离散余弦变换 F ( u , ...
- 二维离散变换由c语言编写,离散余弦变换(DCT)的DSP程序设计与实现
<离散余弦变换(DCT)的DSP程序设计与实现>由会员分享,可在线阅读,更多相关<离散余弦变换(DCT)的DSP程序设计与实现(15页珍藏版)>请在人人文库网上搜索. 1.DS ...
- 二维离散变换由c语言编写,C++实现离散余弦变换(参数为二维指针)(示例代码)...
http://www.cnblogs.com/scut-linmaojiang/p/5013590.html 写在前面 到目前为止已经阅读了相当一部分的网格水印等方面的论文了,但是论文的实现进度还没有 ...
- dct余弦离散c语言,DCT离散余弦变换的DSP实现.doc
DCT离散余弦变换的DSP实现 学生姓名: 指导老师: TMS320VC5402的特性,以运用TMS320VC5402定点DSP芯片完成MPEG-4标准中DCT系数量化为例,简要介绍MPEG-4标准的 ...
- DCT(离散余弦变换(DiscreteCosineTransform))
离散余弦变换(Discrete Cosine Transform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算.在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项 ...
- c语言最新版,【整理】C语言的各种版本:C89,AMD1,C99,C11 – 在路上
[背景] 之前就知道了有个C90和C99. 后来又在: 期间知道有C11. 现在去整理一下,关于C语言的版本方面的更详细的内容. 参考内容: C语言版本历史 C语言主要有三个版本: ANSI C==C ...
- 【 MATLAB 】逆离散余弦变换(idct)的基础知识介绍
基础知识介绍 逆离散余弦变换从离散余弦变换 (DCT) 系数中重建序列.idct 函数是 dct 函数的逆. The DCT has four standard variants. For a tra ...
- JPEG压缩原理与DCT离散余弦变换 量化
原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 1 前言 JPEG是joint Photographic Experts Gr ...
最新文章
- 最全面的百度地图JavaScript离线版开发
- ActiveMQ消息队列的使用及应用
- 树莓派400键盘计算机发布!全新的电路板布局,更快,更酷!
- Seq2Seq之双向解码机制 | 附开源实现
- Python如何将列表分成均匀大小的块?
- 习题7.10 使用割线法求解方程
- mac新建react脚手架
- 马云将于阿里巴巴功成身退?
- pip3 install tesserocr安装失败
- Life is not fair, get used to it.
- mysql -prompt选项
- 免校准的电量计量芯片_应物联网而生:合力为HLW8012系列免校准电能计量芯片-测试测量-与非网...
- 正态分布某一点的概率怎么算_标准正态分布+标准正态分布概率表+分布函数+积分...
- FastDFS安装手册
- samba文件共享服务器拒绝访问,Samba共享文件夹拒绝访问
- python平方的代码怎么写,Python编程之求数字平方代码实例
- 狂神说Java---java学习笔记(图片有些问题,有时间将图片从电脑上传上来)
- BenchmarkSQL对mysql进行性能测试
- 2022年全国职业技能大赛网络安全竞赛试题B模块自己解析思路(5)
- 基于java(springboot)网吧管理系统(java毕业设计)
热门文章
- 汉诺塔的改编题(用栈求解,分别递归和非递归)
- Redis的常用命令——set的常用命令
- 开发期间模板引擎页面修改以后,要实时生效 || 登陆成功,防止表单重复提交,可以重定向||只有登录之后才能访问相关的页面
- Spring Boot与Web开发简介||SpringBoot对静态资源的映射规则
- Service 和 doGet 和 doPost 方法的区别
- Spring Boot错误处理机制以及定制自己的错误页面
- c# 学习笔记 (2) 窗体之间互相调用的方法
- LDO和DC-DC的区别
- opencv 图像阈值分割图像
- MPI派生数据类型发送接收,降低发送时间