fft

matlab dct2和fft2变换的系数分布(BM3D滤波时,相似块分组的阈值凭据)

落爺英雄遲暮 提交于 2020-03-02 12:14:33
clear; woman=imread('C:\Users\ThinkPad\Pictures\lena.jpg'); X=mat2gray(woman); noise=randn(size(X)); sigma=0.1; X=X+noise*sigma; %进行dct2变换 DCT=dct2(X); %进行fft变换 FFT=fft2(X); figure subplot(2,1,1) %查看DCT系数分布情况 histogram(DCT); title('DCT系数分布情况'); subplot(2,1,2) %查看FFT系数分布情况 histogram(real(FFT)); title('FFT系数分布情况'); 对于同一个图像,进行dct2和fft2两种变换时,考察其变换后系数分布。dct2变换后的系数为实数,fft2变换后的系数为复数,复数取实部进行对比: dct2变换的系数基本分布在-1到1之间;而fft2变换的系数则分布在-300到300之间,二值的值差异很大(300倍的差异) 对于图像中的块与块之间,其系数的差异可以通过距离刻画 clear; woman=imread('C:\Users\ThinkPad\Pictures\lena.jpg'); X=mat2gray(woman); noise=randn(size(X)); sigma=0.1; X=X

P3803 【模板】多项式乘法(FFT)

无人久伴 提交于 2020-02-18 21:21:26
P3803 【模板】多项式乘法(FFT) 懒得写了,推荐2篇好博客,比较清晰易懂。 FFT FFT \(\color{blue}{Code}\) #include<bits/stdc++.h> using namespace std; const int N=3000006; const double pi=acos(-1.0); struct cp { double x,y; cp (double xx=0,double yy=0) { x=xx,y=yy; } } a[N],b[N]; cp operator + (const cp &a,const cp &b) { return cp(a.x+b.x,a.y+b.y); } cp operator - (const cp &a,const cp &b) { return cp(a.x-b.x,a.y-b.y); } cp operator * (const cp &a,const cp &b) { return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x); } int n,m,lim=1,l,rev[N]; void fft(cp *a,int o) { for(int i=0; i<lim; ++i) if(i<rev[i])swap(a[i],a[rev[i]]); for(int i=1;

洛谷 P3338 【ZJOI2014】力/BZOJ 3527 力 题解

一世执手 提交于 2020-02-17 18:58:15
洛谷 P3338 【ZJOI2014】力 / BZOJ 3527 力 题解 题意 给定一个正整数 \(n(1\leq n\leq 10^5)\) ,以及有 \(n\) 个元素的浮点数序列 \(q(0<q_i<10^9)\) .要求对于所有的 \(i\in [1,n]\) ,输出 \[ E_j=\sum_{i=1}^{j-1}\frac{q_i\times q_j}{(i-j)^2}-\sum_{i=j+1}^n\frac{q_i\times q_j}{(i-j)^2} \] 注:当你输出的答案与标准答案相差不超过 \(10^{-2}\) 时,即视为答案正确. 题解 显然,暴力是行不通的,所以考虑使用 \(FFT\) 进行卷积来处理. 首先考虑序列能进行卷积所要满足的条件: \[ c_i=\sum_{j=0}^ia_j\times b_{n-j} \] 所以我们必须要把原式变得好看一点才能进行卷积. 我们不妨令 \(a_i=q_i,b_i=\frac{1}{i^2}\) ,那么可以对原式进行一下变形: \[ E_j=\sum_{i=1}^{j-1}\frac{q_i\times q_j}{(i-j)^2}-\sum_{i=j+1}^n\frac{q_i\times q_j}{(i-j)^2} =\sum_{i=1}^{j-1}a_ib_{j-i}-\sum_{i=j+1}^{n}a

FFT算法的一种FPGA实现

感情迁移 提交于 2020-02-16 03:19:54
http://hi.baidu.com/hieda/blog/item/6afab113b8985127dc540179.html 1 引言   OFDM(正交频分复用)是一种多载波数字调制技术,被公认为是一种实现高速双向无线数据通信的良好方法。在OFDM系统中,各子载波上数据的调制和解调是采用FFT(快速傅里叶变换)算法来实现的。因此在OFDM系统中,FFT的实现方案是一个关键因素。其运算精度和速度必须能够达到系统指标。对于一个有512个子载波,子载波带宽20 kHz的OFDM系统中,要求在50 μs内完成512点的FFT运算。   硬件实现FFT算法的主要方案有:DSP(通用数字信号处理器);FFT专用芯片;FPGA(现场可编程门阵列)。DSP具有纯软件实现的灵活性,适合用于流程复杂的算法,例如在通信系统中的信道编、解码,QAM映射等算法。如果在DSP中完成FFT运算,不仅要占用大量D SP的运算时间,使整个系统的数据吞吐率降低,也无法发挥DSP软件实现的灵活性。因此,前端的FFT运算应由ASIC或FPGA完成。采用专用的FFT处理芯片,虽然速度能达到要求,但其可扩展性差。FPGA具有硬件结构可重构的特点。适合于算法结构固定、运算量大的前端数字信号处理。新近推出的FPGA产品都采用多层布线结构,更低的核心电压,更丰富的IO管脚,容量可达到100 k个逻辑单元(LES)

基于matlab的fft变换中参数的设置

≡放荡痞女 提交于 2020-02-14 14:00:52
https://wenku.baidu.com/view/9eacc76bb84ae45c3b358cba.html 此网址可让fft变换中相关的参数讲解的透彻; 简单总结:N为采样点数,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。 假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的 幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。 而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点 N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被 N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:(1) 。由上面的公式可以看出,Fn所能分辨到频率为 Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz

Rock Paper Scissors Lizard Spock

不想你离开。 提交于 2020-02-11 17:25:29
Rock Paper Scissors Lizard Spock 题意: Rock Paper Scissors Lizard Spock 有五种手势,类似于石头剪刀布,有两个串 \(s, t\) ,由这五种手势组成,从某个位置开始匹配,如果 \(t_i\) 能赢 \(s_j\) 得一分,求一个 \(pos(0\le pos \le len(s)-len(t))\) ,使得得分最多 Solution: 将上图记为 \(G\) ,如果 \(op_1\) 可以赢 \(op_2\) ,则 \(G(op_1, op_2)=1\) , 枚举可以得分的手势,假设当前手势为 \(op\) , \[ \begin{aligned} t'_i &=(reverse\_t_{i} == op ? 1 : 0) \\ s'_i &= G[op][s_i] \end{aligned} \] 将 \(t',s'\) 做卷积,累加每次的结果,再遍历一遍匹配的起始位置,取最大值 #include <cstdio> #include <stack> #include <set> #include <cmath> #include <map> #include <time.h> #include <vector> #include <iostream> #include <string> #include

形象理解傅里叶转换顺带fft

喜夏-厌秋 提交于 2020-02-08 13:15:33
形象理解傅里叶转换顺带fft 1 欧拉公式 2 多项式的表示 点值相乘 3傅里叶转换取点 在复平面上取点 傅里叶逆转换 4快速傅里叶转换 5程序 1 欧拉公式 e iπ -1=0; i=(-1) 1/2 ,就是虚数。 写个方程 y=e ix ; 求导 y ’ =ie ix ; 如果把y看做向量,那么y ’ 则垂直于y,也就是垂直于实轴; 通常,导数可以看做y增长的速度; 那么二次导数可以看做加速度; 求二次导 y ’’ =-1e ix ; 可以看出加速度垂直于速度,那么这个y点,将做圆周运动; 由于导数的绝对值是1,所以当x=x 1 时,y点将走过一段长为x 1 的圆弧,当x=π时,刚好转了半圈,所以才有 e iπ -1=0; 然后所以得出 e ix =cos(x)+isin(x),x=[0,2π]; 可以把复平面中的乘法理解为旋转; e ia *e ib =e i(a+b) ; 也就是复数相乘,等于模相乘,弧度相加,但在这里,模都是1,所以只有弧度相加。 2 多项式的表示 f(x)=a 0 +a 1 x+a 2 x 2 +……+a n x n ; 这是系数表示法 如果这样的两个多项式相乘,就会很麻烦,要算n 2 次,所以要把多项式转化成一些点,然后将点相乘,就可以简单点,只需算n次; 我们可以用几个点来确定这个多项式,最简单的情况就是告诉你两个点,你可以确定一条直线,f(x)=a

[Codeforces 580D]Fizzy Search(FFT)

﹥>﹥吖頭↗ 提交于 2020-02-07 12:01:22
[Codeforces 580D]Fizzy Search(FFT) 题面 给定母串和模式串,字符集大小为4,给定k,模式串在某个位置匹配当且仅当任意位置模式串的这个字符所对应的母串的位置的左右k个字符之内有一个与它相同的,求模式串能全部匹配的次数。 分析 我们先考虑 \(k=0\) 的情况,即一般的字符串匹配。设母串为 \(S\) ,模式串为 \(T\) , \(ans_i\) 表示母串从 \(i\) 位置开始与 \(T\) 匹配,能够匹配的字符个数(注意:当遇到不匹配的字符时仍继续匹配,直到匹配完整个串) \[ans_p=\sum_{i=1}^m [S_{p+i-1}=T_i]\] 注意到 \((p+i-1)+i\) 不是常数,不符合卷积的形式。令 \(T_i=T_{m-i+1}\) ,则 \[ans_p=\sum_{i=1}^m [S_{p+i-1}=T_{m-i+1}]\] 这样 \((p+i-1)+(m-i+p)=m+p\) 为常数,符合卷积的形式。但是现在仍然无法FFT处理。 容易发现,每个字符的贡献(即这个字符的匹配个数)是可加的。那么我们可以枚举字符 \(c\) ,设 \(a_{i-1}=[S_i=c],b_{m-i}=[T_i=c]\) ,这样 \(a\) 和 \(b\) 卷积时只有两个位置都为1的时候匹配,对答案产生1的贡献。因此 \(ans_i+=(a

Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT

巧了我就是萌 提交于 2020-02-02 23:51:05
Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口: 洛谷 P3803 【模板】多项式乘法(FFT) 朴素乘法 约定:两个多项式为 \(A(x)=\sum_{i=0}^{n}a_ix^i,B(x)=\sum_{i=0}^{m}b_ix^i\) Prerequisite knowledge: 初中数学知识 (手动滑稽) 最简单的多项式方法就是逐项相乘再合并同类项,写成公式: 若 \(C(x)=A(x)B(x)\) ,那么 \(C(x)=\sum_{i=0}^{n+m}c_ix^i\) ,其中 \(c_i=\sum_{j=0}^ia_jb_{i-j}\) 于是一个朴素乘法就产生了,见代码(利用某种丧心病狂的方式省了 \(b\) 数组) //This program is written by Brian Peng. #pragma GCC optimize("Ofast","inline","no-stack-protector") #include<bits/stdc++.h> using namespace std; #define Rd(a) (a=read()) #define Gc(a) (a=getchar()) #define Pc(a) putchar(a) int read(){

FFT(快速傅里叶变换)学习笔记

一笑奈何 提交于 2020-01-31 10:02:43
che dan环节: 概述 快速傅里叶变换(Fast Fourier Transformation),简称 \(FFT\) ,它可以在 \(O(n \ log \ n)\) 的时间内算两个多项式的乘积的所有系数。 是一个听起来逼格很高,实际逼格更高的算法。 一些定义 下面我们来交代一些奇怪的东西。 一个 \(n\) 项 \(n-1\) 次多项式, \(F(x) = a_0x^0 + a_1x^1 + \dots + a_{n-1}x^{n-1}\) 则多项式 \(F(x)\) 可以用 __系数表示法__表示成 \(F(x) = \{ a_0,a_1,\dots,a_{n-1} \}\) 方便的,我们可以把 \(F\) 看成一个数组,用 \(F[k]\) 表示多项式 \(F\) 的 \(k\) 次项系数,即 \(F[k] = a_k\) ,如果 \(F\) 不存在 \(k\) 次项的话系数就是零即 \(F[k] = 0\) 。 那么多项式 \(F\) ( \(n\) 次), \(G\) ( \(m\) 次)的乘积会得到一个 \(n + m\) 次多项式 \(H\) 就满足 \(H[k] = \sum\limits_{i = 0}^{k} F[i]G[k-i]\) ,按这样算多项式乘法就是 \(O(n^2)\) 的。 如果您是个明白人的话会发现多项式乘法就是一个加法卷积