目录

  • DCT
    • 定义
      • c程序
      • c结果
      • matlab结果
    • 测试的问题
      • 得出的数据
    • 修改成功后

DCT

定义

给定序列x(n),n=0,1…N-1,其离散余弦变换定义为

Xc(0)=1N∑n=0N−1x(n)X_c(0)=\frac{1}{\sqrt{N}}\sum_{n=0}^{N-1}x(n)Xc​(0)=N​1​∑n=0N−1​x(n)

Xc(k)=2N∑n=0N−1x(n)cos(2n+1)∗k∗π2N,n=0,1...,N−1X_c(k)=\sqrt{\frac{2}{N}}\sum_{n=0}^{N-1}x(n)cos\frac{(2n+1)*k*\pi}{2N},n=0,1...,N-1Xc​(k)=N2​​∑n=0N−1​x(n)cos2N(2n+1)∗k∗π​,n=0,1...,N−1

其变换的核函数

Ck,n=2Ngkcos(2n+1)kπ2N,k,n=0,1....,N−1C_{k,n}=\sqrt{\frac{2}{N}}g_kcos\frac{(2n+1)k\pi}{2N}, k,n=0,1....,N-1Ck,n​=N2​​gk​cos2N(2n+1)kπ​,k,n=0,1....,N−1

是实数,式中系数

c程序

#include<stdio.h>
#include<math.h>
#define N 64
#define pi 3.14159
int main()
{int n,k;float y[100],xn[100];//输出,输入信号for(k=0; k<N; k++)//循环求X(k){if(k==0){for(n=0; n<N; n++){xn[n]=cos(n*pi/6.0);y[n]=sqrt(1.0/N)*xn[n];//公式y[k]+=y[n];}}else{for(n=0; n<N; n++){xn[n]=cos(n*pi/6.0);y[n]=sqrt(2.0/N)*xn[n]*cos((2.0*n+1)*k*pi/(2.0*N));//公式y[k]+=y[n];}}printf(" %d   %lf\n",k,y[k]);}}

matlab

>> N=64;
>> n=0:1:N;
>> xn=cos(n*pi/6);
>> figure
>> y=dct(xn);
>> stem(n,y)

c结果

matlab结果

对比有点差异,跟FFT的差异相似。
有大佬知道怎么修改的请评论下,感谢

测试的问题

#include <stdio.h>//标准输入输出头文
#include<math.h>//声明了常用的一些数学运算
#define pi 3.1415
#define N 64//64个点
int main()
{int n,k;double xn;//输入信号double y[100];//输出,输入信号for(k=0; k<N; k++)//循环求X(k){for(n=0; n<N; n++){xn=1.0;y[k] += xn;}printf("%d  %f\n",k,y[k]);}}

得出的数据

0
-1.#QNAN0
1 64.000000
2
-1.#QNAN0
3 64.000000
4 64.000000
5 64.000000
6 64.000000
7
-1.#QNAN0
8 64.000000
9 64.000000
10 3072570228342306800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
11 64.000000
12 64.000000
13 64.000000
14 64.000000
15 3072569644077048600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
16 64.000000
17 64.000000
18 64.000000
19 64.000000
20 64.000000
21 64.000000
22 64.000000
23 64.000000
24 64.000000
25 64.000000
26 64.000000
27 64.000000
28 64.000000
29 64.000000
30 64.000000
31 2833760479163969400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
32 64.000000
33 64.000000
34 64.000000
35 64.000000
36 64.000000
37 64.000000
38 64.000000
39 64.000000
40 64.000000
41 3488645024638201700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
42
-1.#QNAN0
43 3581851895918701500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
44 64.000000
45 64.000000
46 64.000000
47 64.000000
48 64.000000
49 64.000000
50 64.000000
51 64.000000
52 64.000000
53 64.000000
54 64.000000
55 64.000000
56 64.000000
57 64.000000
58 64.000000
59 64.000000
60 64.000000
61 64.000000
62 64.000000
63 64.000000

发现 0,2,7,10,15,31,41,42,43是错误的。

修改成功后

发现是定义的范围大小不够,以及增添一个下x[n]函数,改了如下

double y[1000],x[100]

#include<stdio.h>
#include<math.h>
#define N 64
#define pi 3.14159
int main()
{int n,k;double xn;double  y[1000],x[100];//输出,输入信号for(k=0; k<N; k++)//循环求X(k){if(k==0){for(n=0; n<N; n++){xn=cos(n*pi/6.0);x[n]=sqrt(1.0/N)*xn;//公式y[k]+=x[n];}}else{for(n=0; n<N; n++){xn=cos(n*pi/6.0);x[n]=sqrt(2.0/N)*xn*cos((2.0*n+1)*k*pi/(2.0*N));//公式y[k]+=x[n];}}printf(" %d   %lf\n",k,y[k]);}}

然后我发现matlab的好像程序错了,修改了下

> n=0:1:63;
>> x=cos(n*pi/6);
>> y=dct(x);
>> figure
>> stem(n,y)

c 的结果图

matlab的结果图

结果图跟matlab相差不多

DCT C语言 修改了c程序以及matlab的程序相关推荐

  1. matlab程序循环,matlab循环程序只得到一个结果

    如题.matlab编程,for循环语句,本来要它循环100次,但是得到的结果却只有一个,本想得到100个的. 求牛人指点.整个程序较简单,很多类似语句,目的是求7种方法得到的列向量的7个离差平方和,这 ...

  2. 安装matlab应用程序遇到意外错误并且需要关闭。您可能需要尝试重新安装产品。有关详细信息,请查看C:\user\name\AppData\Local\Temp\mathworks_name.log

    当安装matlab时可能会遇到以下问题,目前解决方案还是不能确定,不过官方给出了以下截图的回复. 注:图源来自:https://blog.csdn.net/weixin_43837441/articl ...

  3. c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...

    对编译.链接.OS内核.系统调优等技术感兴趣的童鞋,不妨右上角关注一下吧,近期会持续更新相关方面的专题文章!引言 近日,网上看到一篇文章,分析数组访问的性能问题.文章经过一系列"有理有据&q ...

  4. c语言运行时更入下一行,C语言高级语言程序设计(一)_第二章 C程序设计基础(二).ppt...

    C语言高级语言程序设计(一)_第二章 C程序设计基础(二) * 问a,b能否交换?不能.示例 传值调用 如何改变参数的值?在后续章节中介绍 下:传值 * 传值的好处 下:问题3.2 * * * 使用范 ...

  5. c语言学生成绩查询课设报告,C语言课设报告(学生考试成绩查询程序)【荐】.doc...

    C语言课设报告(学生考试成绩查询程序)[荐].doc 学生考试成绩查询程序 学号:******** 姓名:***** 完成日期:****年月 通过键盘输入学生的考试信息,包括:学号.姓名.课程名称.学 ...

  6. 从入门到入土:基于C语言采用UDP协议实现通信功能的程序

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  7. C语言编程>第二十三周 ③ 下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元素进行排序;然后把第三字符插入

    例题:下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序.插入法的基本算法是:先对字符串中的头两个元素进行排序:然后把第三字符插入到前两个字符中,插入后前三个字 ...

  8. 易语言修改IP和DNS

    易语言修改IP和DNS 修改IP和DNS的时候,有一个参数叫"连接名称", 不清楚这个参数导致走了不少弯路 "连接名称"对应的是"网络和共享中心&qu ...

  9. 第一章 c语言概述程序逻辑,第一章 程序逻辑与C语言概述

    1.第一章 程序逻辑与C语言概述,1.1 C语言概述1.2 程序和程序逻辑,第一章 程序逻辑与C语言概述,1.1 C语言概述,[学习目标]了解C语言工作机制掌握C语言程序的的基本构成了解C语言程序的编 ...

最新文章

  1. 这道算法题太简单?你忽略了时间复杂度的要求!
  2. AzureDirectory Library for Lucene.Net
  3. 【数字智能三篇】之一: 一页纸说清楚“什么是大数据”
  4. win10关闭windows聚焦_Win10优化:这8个操作简单的小方法让你的Win10系统更加流畅...
  5. linux c之判断字符串是不是以另一字符串开始或者结尾
  6. android dialog activity 窗口全透明,Android Dialog形式的Activity
  7. ajax传值改变对应样式(方法:定义属性)
  8. 孙子和外孙就是不一样吗?
  9. hibernate 执行存储过程 方法
  10. 查找表_leetcode454
  11. yolov3聚类自己数据的anchor box
  12. 极客大学产品经理训练营:产品经理的项目管理 第14课总结
  13. 写给想学 Javascript 朋友的一点经验之谈
  14. Eclipse环境变量配置
  15. 如何安装王码五笔字型输入法86版
  16. renpy-视觉小说转换器-编程零基础写视觉小说
  17. Fabric.js中文文档
  18. php各版本共存方法,PHP多版本共存解决方案图解
  19. 网站在线视频播放实现
  20. 阿里云建站教程——ECS服务器

热门文章

  1. Introduction for i-Teams
  2. 送你一朵小红花观后感
  3. 多线程的多核分配问题验证
  4. 关于U打包代码必须放到Editor目录下的问题
  5. C#new出来的结构体内存分配
  6. onlevelwasloaded的调用时机
  7. 归纳DOM事件中各种阻止方法
  8. thinkphp源码分析(一)—开门篇
  9. frp后台运行和停止
  10. Elasticsearch分布式一致性原理剖析(三)-Data篇