fft相关的复习

任意长度卷积 CZT

就是一波推导
\[
\begin{aligned}
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;
}

原文地址:https://www.cnblogs.com/foreverpiano/p/10502674.html

时间: 2024-08-30 10:49:08

fft相关的复习的相关文章

多项式FFT相关模板

自己码了一个模板...有点辛苦...常数十分大,小心使用 #include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <algorithm> #include <vector> using namespace std; #de

快速傅立叶变换(FFT)相关内容汇总

FFT是近年考察非常频繁的算法,与其相关的知识点也相当多样. 这里主要是资料汇总,内容补充和总结等.具体应用应在各大OJ上做相关题目. 目录: 概述 1. 前置技能:数学基础 1.1 多项式概念与运算. 1.2 微积分初步与泰勒展开 1.3 普通型生成函数与指数型生成函数 1.4 线性代数相关(矩阵,行列式与特征多项式) 1.5 组合数与伯努利数 1.6 常系数齐次线性递推 1.7 初等数论与初等代数 1.8 卷积概念与O(n^2)求法 1.9 拉格朗日插值法 2. FFT:快速傅立叶变换算法总

JAVA相关知识复习

1.HTTP访问方式: GET.POST.HEAD.DELETE.TRACE.PUT.OPTIONS HEAD表示查询文档头信息,服务器会返回文件类型.长度.最后修改时间等信息,该方式很少被使用. GET方式常用来查询信息:提交数据不能超过256个字符(URL总长度不能超过255个字符).提交的查询内容java是显示在浏览器地址栏中的. POST方式提交数据,数据不在浏览器地址栏中显示.发送的命令需要提供提交的数据类型和长度.常用来提交表单数据.提交的内容长度不受限制. 数据类型有两种:一种是普

Linux学习笔记11_系统操作、优化相关命令复习

关机 poweroff         //直接关机 shutdown        //系统1分钟后关闭(poweroff) shutdown [NUM]     //系统在参数设定的分钟数后关闭(poweroff) shutdown -H            //halt(系统关闭,主板未断电) shutdown -h now    //先halt再poweroff shutdown -r      //重启(reboot) shutdown -k     //只会发出关机提示信息,并不会

图解C# Console 输出和Console相关编程复习总结

1 基本控制台输出 首先进入 SharpDevelop ,新建一个控制台工程: SharpDevelop简介: http://blog.csdn.net/bcbobo21cn/article/details/44200205 using System; namespace conwrdemo { class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); // T

awk 相关的复习

1. awk 引用外部变量: aa=666  echo "." | awk -v GET_A=$aa '{print GET_A}' . sort -n fuxi.awk |awk -F ':' '{print $1}'|uniq >id.txt[[email protected]_year awk]# for id in `cat id.txt`; do> echo "[$id]"> awk -v id2=$id -F ':' '$1==id2

洛谷.3803.[模板]多项式乘法(FFT)

题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. #include <cmath> #include <cctype> #include <cstdio> #include <algorithm> #define gc() getchar() const int N=1e6+5; const double PI=acos(-1); int n,m; struct Complex { double

STM32F4使用FPU+DSP库进行FFT运算的测试过程

测试环境:单片机:STM32F407ZGT6   IDE:Keil5.20.0.0  固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使用void arm_cfft_radix4_f32(const arm_cfft_radix4_instance_f32 * S,float32_t * pSrc)函数进行FFT运算. 准备空工程,配置Keil环境.使能STM32F4的FPU单元. 开启硬件浮点运算,等效于在C/C++->defin

DSP5509项目之用FFT识别钢琴音调(4)之麦克风输入

1. 麦克风输入需要修改的内容,之前的版本是LINE IN的输入.实现功能,检测麦克风的输入,并且同时在耳机里面播放. #include <csl.h> #include <csl_i2c.h> #include <stdio.h> #include <csl_pll.h> #include <csl_mcbsp.h> #include "myapp.h" #include "csedu.h" #inclu