Radix4 Radix8等更高级的FFT的推导以及Unity中的实现和性能分析

一、Radix2的傅里叶变换的缺陷

首先,我们解释一下什么是Radix2,Radix4,Radix8等的傅里叶变换。在上一篇中,我们得出我们可以将N的傅里叶变换的输入拆为奇数和偶数,然后奇数和偶数分别进行傅里叶变换,再通过蝶形变换组合为N的傅里叶变换的结果。简单的公式形式化描述如下

$$
DFT(N) = DFT_1(\frac N 2) \oplus DFT_2(\frac N 2), \oplus表示蝶形变换
$$

我们可以知道,一次蝶形变换中所做的计算非常少,每一轮GPU派发很多任务,然后每个任务仅执行一次2个数据的蝶形变换,然后就结束写回Buffer了。这样我们的瓶颈往往会卡在DrawCall上。

Continue Reading...

记一次PC的辅助开发记录

【先声明,本人没有对该游戏服务器做任何数据篡改,也没有改动客户数据,仅仅是监控数据并模拟鼠标操作。本外挂仅当时自己用过一两天。】
最近在整理自己以前开的各种坑的代码,发现自己以前脑子发热做的一些稀奇古怪的东西。时间太久,感觉都忘记的差不多了。因此开个博客坑,写一下一些项目的开发心得。
大概是在研究生一年级的时候,2014年的时候,那时候的暑假,《幻想神域》端游的国服上线了,是搜狐畅游代理的,我当时是一个忠实的二次元+游戏玩家,所以义不容辞的去玩了一下。那时候,游戏里有个钓鱼玩法,可以钓到不少好东西,但是这个玩法实在是太枯燥啦。因此,当时心生邪念,我得做个工具辅助我通宵挂钓鱼。然而写完之后,我对这个游戏已经失去了兴趣,然后就被遗忘了。。

Continue Reading...

Radix2 FFT推导以及Unity中实现

一、连续傅里叶变换 和 离散傅里叶变换

假设$f$是复平面上的勒贝格可积的函数,则定义$f$的连续傅里叶变换$F$是
对于任意实数$w$,

$$
F(\omega) =
\int_{-\infty} ^{\infty} f(t) e^ { -i \omega t }dt
\tag{1}

$$

在这里,我们解释$\omega$为角频率,$F(\omega)$是复数,并且是信号在该频率成分处的幅度和相位。

Continue Reading...

Java JNI 编程入门

JNI是Java Native Interface的缩写,JNI是一种机制,有了它就可以在java程序中调用其他native代码,或者使native代码调用java层的代码。也 就是说,有了JNI我们可以使Android项目中,java层与native层各自发挥所长并相互配合。

JNI相对与native层来说是一个接口,java层的程序想访问native层,必须通过JNI,反过来也一样。JNI的学习,在我看来,主要可分为以下几个方面

Java基本数据类型和C语言中基本数据类型的对应关系

JAVA中调用C语言的函数

初始化加载native的动态链接库

在Java层编写函数的声明

在C/C++层编写函数的实现

编写native的成员函数

编写native的静态函数

C/C++层调用Java的函数和变量

Continue Reading...

初等数论-第三章第一节-素数

3.1.7 如果$a$和$n$是正整数,$n>1$且$a^n - 1$是素数,那么证明,$a=2$且$n$是素数。

证明:由$a^n - 1$ = $(a-1)(a^{n-1} + a^{n-2} + ... + a + 1)$可知
要使得$a^n - 1$是合数,则$a-1=1$,因此a=2.
另外,不妨假设$n$不是素数,令$n=kp$,其中$k,p$均为大于1的正整数,则$a^{kp} - 1 = (a^k - 1)(a^{k(p-1)} + a^{k(p-2)} + ... + a^{k} + 1)$。这与$a^n-1$是素数矛盾。
因此 $a=2$且$n$是素数。

Continue Reading...