Go语言版:离散正弦变换与离散余弦变换及其逆变换

func dst(in []float64) []float64 {
    out := make([]float64, len(in))
    nr := len(in)

    for i := 0; i < nr; i++ {
        for j := 0; j < nr; j++ {
            tmp := (float64(i) + 0.5) * (float64(j) + 0.5) / float64(nr)
            out[i] += in[j] * math.Sin(tmp*math.Pi)
        }
    }

    return out
}

func idst(in []float64) []float64 {
    out := dst(in)
    for i, v := range out {
        out[i] = v * 2 / float64(len(in))
    }
    return out
}

func dct(in []float64) []float64 {
    out := make([]float64, len(in))
    nr := len(in)

    for i := 0; i < nr; i++ {
        for j := 0; j < nr; j++ {
            tmp := float64(i) * (float64(j) + 0.5) / float64(nr)
            out[i] += in[j] * math.Cos(tmp*math.Pi)
        }
    }

    return out
}

func idct(in []float64) []float64 {
    out := make([]float64, len(in))
    nr := len(in)

    for i := 0; i < nr; i++ {
        out[i] = in[i] / 2

        for j := 0; j < nr; j++ {
            tmp := float64(j) * (float64(i) + 0.5) / float64(nr)
            out[i] += in[j] * math.Cos(tmp*math.Pi)
        }

        out[i] = out[i] * 2 / float64(nr)
    }

    return out
}
时间: 2024-10-16 00:30:12

Go语言版:离散正弦变换与离散余弦变换及其逆变换的相关文章

理解离散傅立叶变换(一. 傅立叶变换的由来)

理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,不管是书本还是在网上可以非常easy找到关于傅立叶变换的描写叙述,可是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人非常难可以从感性上得到理解,近期,我偶尔从网上看到一个关于数字信号处理的电子书籍,是一个叫Steven W. Smith, Ph.D.外国人写的,写得非常浅显,里面有七章由浅入深地专门讲述关于离散信号的傅立叶变换,尽管是英文文档,我还是硬着头皮看完了有关傅立叶变换的有关内容,看了

理解离散傅立叶变换(一. 傅立叶的起源变换)

理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,不管是书本还是在网上可以非常easy找到关于傅立叶变换的描写叙述,可是大都是些故弄玄虚的文章,太过抽象.尽是一些让人看了就望而生畏的公式的罗列,让人非常难可以从感性上得到理解.近期.我偶尔从网上看到一个关于数字信号处理的电子书籍,是一个叫Steven W. Smith, Ph.D.外国人写的,写得非常浅显,里面有七章由浅入深地专门讲述关于离散信号的傅立叶变换.尽管是英文文档.我还是硬着头皮看完了有关傅立叶变换的有关内容,看了

离散傅立叶变换,快速傅立叶变换和傅里叶级数

目的:要学习通讯或者从事通讯行业都免不了要接触傅立叶变换,傅立叶变换有很多形式包括积分形式和离散形式的,公式也是各种积分或者累加,我在学习的初始是直接背下来这些公式,并没有想过每个公式里变量和积分以及累加的含义.因此现在有了写一篇关于傅立叶变换的博客的想法.本篇主要以最简单的cos(t)为例,以Matlab为媒介,比较Discrete Fourier Transform(DFT)和Fast Fourier Transform (FFT).这是因为DFT是我在学习信号处理时老师直接给的公式,而FF

基于BP神经网络的简单字符识别算法自小结(C语言版)

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:[email protected] 写在前面的闲话: 自我感觉自己应该不是一个很擅长学习算法的人,过去的一个月时间里因为需要去接触了BP神经网络.在此之前一直都认为算法界的神经网络.蚁群算法.鲁棒控制什么的都是特别高大上的东西,自己也就听听好了,未曾去触碰与了解过.这次和BP神经网络的邂逅,让我初步掌握到,理解透彻算法的基本原理与公式,转为计算机所能识别的代码流,这应该就是所谓的数学和计

C++实现离散余弦变换

写在前面 到目前为止已经阅读了相当一部分的网格水印等方面的论文了,但是论文的实现进度还没有更上,这个月准备挑选一些较为经典的论文,将其中的算法实现.在实现论文的过程中,发现论文中有用到一些空域转频率域的算法.因此也就想到了实现一下离散余弦变换.虽然本文的代码和网上很多已有的代码很类似,思路都没有太多的差别,但是本文有一个比较重要的改进.具体的说,网上现有DCT算法输入的是一个固定的二维数组.当二维数组作为函数参数进行传递时,至少需要给出第二个维度的大小,否则编译器会报错.但是在图形图像处理中,当

算法系列之二十四:离散傅立叶变换之音频播放与均衡器

导语 在算法系列的第二十二篇,我们介绍了离散傅立叶变换算法的实现,将时域的音频信号转换到频域进行分析,获取拨号音频的频率特征.这一篇我们将介绍一种频域均衡器的实现方法,所谓的频域均衡器,就是在频域信号的基础上对音频数据进行调整,然后再将频域信号转换成时域信号在回放设备上播放,从而达到音色调节的目的.将频域信号转换成时域信号的算法,就是离散傅立叶逆变换算法. 1 离散傅立叶逆变换 有从时域转换到频域的方法,就必然有从频域转换到时域的方法,相对于离散傅里叶变换,这个反向转换就是离散傅里叶逆变换(ID

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示 算法系列之二十三离散傅立叶变换之音频播放与频谱显示 导语 什么是频谱 1 频谱的原理 2 频谱的选择 3 频谱的计算 显示动态频谱 1 实现方法 2 杂项说明 结果展示 导语 频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷.在上一篇对离散傅立叶变换介绍的基础上,本篇就进一步介绍一下频谱是怎么回事儿,下一篇继续介绍

《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

先附上文档归类目录: 课本源码合辑  链接??? <数据结构>课本源码合辑 习题集全解析  链接??? <数据结构题集>习题解析合辑 博主有话说: 01.自学编程,难免思路阻塞,所以从今天起,我(StrayedKing)决定在本博客陆续更新严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步.        ★注★ 左侧随笔分类下用两个栏目:<课本源码>.<习

人事管理系统 c语言版

int menu(){ printf("请按提示输入完成操作!\n"); printf("1.查询员工信息\n"); printf("2.统计员工数量\n"); printf("3.录入员工信息\n"); printf("4.删除员工信息\n"); printf("5.按id排序所有员工\n"); printf("6.打印所有员工信息\n"); printf(&quo