fft相关的复习
任意长度卷积 CZT
就是一波推导
b_i &= \sum_{j=0}^{n-1} \omega^{ij}a_j \\
&= \sum_{j=0}^{n-1} \omega^{\frac{i^2+j^2-(i-j)^2}{2}}a_j \\
&= \omega^{\frac{i^2}{2}} \sum_{j=0}^{n-1}\omega^{\frac{-(i-j)^2}{2}} a_j \omega^{j^2}
\end {aligned}
\]
后面是一个减法卷积,就可以扩展到2的幂次直接fft就好了。
2次dft计算卷积
考虑有两个长度为\(n = 2^k\)的序列\(a(x), b(x)\),我们要计算他们的dft。
构造序列\(p_k = a_k + ib_k, \; q_k = a_k - ib_k\),
有结论\(dft_q(k) = conj(dft_p((n - k) \mod n))\)。展开,考虑几何意义???
我们可以解出\(dft_a, dft_b\)。
再做一遍idft就可以了
拆系数fft
记\(M = \sqrt {mod}\),把\(x\)表示成\(x = a \times M + b, b < M\)。
\((a \times M + b)(c \times M + d) = ac \times M^2 + (ad + bc) \times M + bd\)
对每一项分开算,做7次dft就可以了。
套用上述介绍做法4次dft就够了。
实现上注意在idft的时候,直接把一个序列放在real,另一个放在imag,idft回来直接/N后计算贡献就好了。
以及我们可以直接在一个for里面做解出AB,reverse序列的事情。
下面是关键部分的代码。
poly realmain(poly a, poly b) {
int n = a.size(), m = b.size();
prepare(n + m - 1);
for (int i = 0; i < n; i++) A[i] = cpx(a[i] & 32767, a[i] >> 15);
for (int i = 0; i < m; i++) B[i] = cpx(b[i] & 32767, b[i] >> 15);
dft(A, fft_n); dft(B, fft_n);
for (int i = 0; i < fft_n; i++) {
int j = (fft_n - i) % fft_n;
cpx ax, ay, bx, by;
ax = (A[i] + A[j].conj()) * cpx(0.5, 0);
ay = (A[i] - A[j].conj()) * cpx(0, -0.5);
bx = (B[i] + B[j].conj()) * cpx(0.5, 0);
by = (B[i] - B[j].conj()) * cpx(0, -0.5);
C[j] = ax * bx + ay * by * cpx(0, 1.0);
D[j] = ay * bx + ax * by * cpx(0, 1.0);
}
dft(C, fft_n); dft(D, fft_n);
poly ans(n + m - 1, 0);
for (int i = 0; i < ans.size(); i++) {
lo ax = lo(C[i].x / fft_n + 0.5) % mod;
lo ay = lo(C[i].y / fft_n + 0.5) % mod;
lo bx = lo(D[i].x / fft_n + 0.5) % mod;
lo by = lo(D[i].y / fft_n + 0.5) % mod;
ans[i] = ax + ((by + bx) << 15) + (ay << 30);
ans[i] = (ans[i] % mod + mod) % mod;
}
return ans;
}
fft相关的复习的更多相关文章
- 多项式FFT相关模板
自己码了一个模板...有点辛苦...常数十分大,小心使用 #include <iostream> #include <stdio.h> #include <math.h& ...
- 快速傅里叶变换(FFT)相关内容汇总
(原稿:https://paste.ubuntu.com/p/yJNsn3xPt8/) 快速傅里叶变换,是求两个多项式卷积的算法,其时间复杂度为$O(n\log n)$,优于普通卷积求法,且根据有关证 ...
- awk 相关的复习
1. awk 引用外部变量: aa=666 echo "." | awk -v GET_A=$aa '{print GET_A}' . sort -n fuxi.awk |awk ...
- sed 等相关的复习
sed相打印两行之间的内容: sed -n '/111/,/aad/p' fuxi.txt grep -n ".*" fuxi.txt sed -n '2,9'p fuxi.txt ...
- 用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台)(转)
源:用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台) 代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细. /*********************** ...
- STM32F4使用FPU+DSP库进行FFT运算的测试过程一
测试环境:单片机:STM32F407ZGT6 IDE:Keil5.20.0.0 固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使 ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- DSP5509项目之用FFT识别钢琴音调(4)之麦克风输入和Line in输入
1. 麦克风输入需要修改的内容,之前的版本是LINE IN的输入.实现功能,检测麦克风的输入,并且同时在耳机里面播放. #include <csl.h> #include <csl_ ...
- DSP5509项目之用FFT识别钢琴音调(1)
1. 其实这个项目难点在于,能不能采集到高质量的钢琴音调.先看一下FFT相关程序. FFT 并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法.由于我们在计算 DFT 时一次复数乘法需用四 ...
随机推荐
- spring boot 中@Autowired注解无法自动注入的错误
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/huihuilovei/article/de ...
- JavaScript中数组的key-value在对象中倒装的妙用
对于数组的去重.寻找指定元素的索引,通常我们都是通过遍历来解决,但是在某些应用场景下,将数组的value-key进行倒装,也即将value当做对象的key,key当做对象value,可以极大降低算法的 ...
- 转:Java接口和抽象类
转:http://www.cnblogs.com/dolphin0520/p/3811437.html 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有 ...
- jQuery中的 AJAX
jQuery库中支持AJAX的操作,功能十分完善 详细请参考官方文档:https://www.jquery123.com/category/ajax/ 首先需要引入jquery文件!!! $.ajax ...
- jQuery 名称发生冲突怎么办【问题】
[问题]jQuery 名称发生冲突怎么办? [答案]jQuery 使用 $ 符号作为 jQuery 的简介方式.某些其他 JavaScript 库中的函数(比如 Prototype)同样使用 $ 符号 ...
- UCOSIII互斥信号量
互斥信号量可以解决优先级反转问题 优化后现象 优化方法:L和H等待同一个信号量的时候,将L任务优先级提至H相同优先级 实验举例 void start_task(void *p_arg) { OS_CR ...
- Discuz!数据库操作DB类和C::t类介绍
类定义文件 DB类: 文件\source\class\class_core.php class DB extends discuz_database {} discuz_database类定义 文件\ ...
- out string
示例 当希望方法返回多个值时,声明 out 方法很有用.使用 out 参数的方法仍然可以将变量用作返回类型(请参见 return),但它还可以将一个或多个对象作为 out 参数返回给调用方法.此示例使 ...
- Spring Boot 笔记 (1) - Maven、基本配置、Profile的使用
一. Spring Boot 简介 开箱即用的一站式 Java EE 解决方案 Spring 技术栈的大整合 核心问题 暂时无法回答 Spring Boot 和 SOA 有什么区别? Spring B ...
- PHP标记风格,编码规范
PHP标记风格PHP一共支持4种标记风格 <?php echo "这是XML风格的标记"; ?> 脚本风格 <script language="php& ...