作者:桂。

时间:2018-05-20  12:04:24

链接:http://www.cnblogs.com/xingshansi/p/9063131.html


前言

相比DFT,CZT是完成频谱细化的一种思路,本文主要记录CZT的C代码实现。

一、代码实现

原理主要参考MATLAB接口:

对应C代码实现:

Complex.c

/*=============================
Chirp-Z Transform
=============================*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "Complex.h"
#include "FFT.h" void CZT(comp* x, int N, comp A, comp W, comp *xCZT, int M);
void main()
{
int i;
int N,M; double PI;
double A0,Theta0;
double W0,Phi0; comp* x;
comp* xCZT;
comp A,W; PI = 3.1415926; N = ; //信号长度
M = ; //chirp-z 变换输出长度
x = (comp *)calloc(N,sizeof(comp));
xCZT = (comp *)calloc(M,sizeof(comp));
for (i = ;i < N; i++)
{
x[i].re=(float)(i-);
x[i].im = 0.0;
} A0 = 1.0; //起始抽样点z0的矢量半径长度
Theta0 = 0.0; //起始抽样点z0的相角
A.re = (float)(A0*cos(Theta0));
A.im = (float)(A0*sin(Theta0)); Phi0 = 2.0*PI/M; //两相邻抽样点之间的角度差
W0 = 1.0; //螺线的伸展率
W.re = (float)(W0*cos(-Phi0));
W.im = (float)(W0*sin(-Phi0)); CZT(x,N,A,W,xCZT,M); printf("The Original Signal:\n");
for (i = ; i<N; i++)
{
printf("%10.4f",x[i].re);
printf("%10.4f\n",x[i].im);
} printf("The Chirp-Z Transfrom:\n");
for (i = ;i<M ;i++)
{
printf("%10.4f",xCZT[i].re);
printf("%10.4f\n",xCZT[i].im);
} } /*----------------函数说明----------------------
Name: CZT
Function: Chirp-Z Transform
Para: x[in][out]:待变换信号 N[in]:信号长度
A[in]: W[in]:
M[in]:Chirp-Z变换输出长度
--------------------------------------------*/
void CZT(comp* x, int N, comp A, comp W, comp* xCZT, int M)
{
int i;
int L; comp* h;
comp* g;
comp* pComp;
comp tmp,tmp1,tmp2; i=;
do
{
i*=;
} while (i<N+M-);
L = i; h = (comp*)calloc(L,sizeof(comp));
g = (comp*)calloc(L,sizeof(comp));
pComp = (comp*)calloc(L,sizeof(comp)); for (i = ; i<N; i++)
{
tmp1 = cpow(A,-i);
tmp2 = cpow(W, i*i/2.0);
tmp = cmul(tmp1,tmp2);
g[i] = cmul(tmp,x[i]);
}
for (i = N;i<L; i++)
{
g[i] =czero();
} FFT(g,L,); for (i = ;i<=M-;i++)
{
h[i] = cpow(W, -i*i/2.0);
}
for (i=M; i<=L-N;i++)
{
h[i] =czero();
}
for (i = L-N+; i<=L;i++)
{
h[i] = cpow(W,-(L-i)*(L-i)/2.0);
} FFT(h,L,); for (i = ; i<L; i++)
{
pComp[i] = cmul(h[i],g[i]);
} FFT(pComp,L,-); //IDFT for (i = ; i<M;i++)
{
tmp = cpow(W,i*i/2.0);
xCZT[i] = cmul(tmp,pComp[i]);
} }

Complex.h

/*===========================
Define comp as complex type
cmplx c = (a,b)
cmul c=a*b
conjg c=a'
cabs1 f=|a|
cabs2 f=|a|**2
cadd c=a+b
csub c=a-b
czero c=(0.0,0.0)
===========================*/
#ifndef COMPLEX_H
#define COMPLEX_H
#include <math.h>
typedef struct xy
{
float re;
float im;
}comp;
comp cmplx(float a,float b);
comp cmul(comp a,comp b);
comp conjg(comp a);
float cabs1(comp a);
float cabs2(comp a);
comp cadd(comp a,comp b);
comp csub(comp a,comp b);
comp czero();
comp cpow(comp a,double n);
float arg(comp a); #endif

CZT.c

/*=============================
Chirp-Z Transform
=============================*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "Complex.h"
#include "FFT.h" void CZT(comp* x, int N, comp A, comp W, comp *xCZT, int M);
void main()
{
int i;
int N,M; double PI;
double A0,Theta0;
double W0,Phi0; comp* x;
comp* xCZT;
comp A,W; PI = 3.1415926; N = ; //信号长度
M = ; //chirp-z 变换输出长度
x = (comp *)calloc(N,sizeof(comp));
xCZT = (comp *)calloc(M,sizeof(comp));
for (i = ;i < N; i++)
{
x[i].re=(float)(i-);
x[i].im = 0.0;
} A0 = 1.0; //起始抽样点z0的矢量半径长度
Theta0 = 0.0; //起始抽样点z0的相角
A.re = (float)(A0*cos(Theta0));
A.im = (float)(A0*sin(Theta0)); Phi0 = 2.0*PI/M; //两相邻抽样点之间的角度差
W0 = 1.0; //螺线的伸展率
W.re = (float)(W0*cos(-Phi0));
W.im = (float)(W0*sin(-Phi0)); CZT(x,N,A,W,xCZT,M); printf("The Original Signal:\n");
for (i = ; i<N; i++)
{
printf("%10.4f",x[i].re);
printf("%10.4f\n",x[i].im);
} printf("The Chirp-Z Transfrom:\n");
for (i = ;i<M ;i++)
{
printf("%10.4f",xCZT[i].re);
printf("%10.4f\n",xCZT[i].im);
} } /*----------------函数说明----------------------
Name: CZT
Function: Chirp-Z Transform
Para: x[in][out]:待变换信号 N[in]:信号长度
A[in]: W[in]:
M[in]:Chirp-Z变换输出长度
--------------------------------------------*/
void CZT(comp* x, int N, comp A, comp W, comp* xCZT, int M)
{
int i;
int L; comp* h;
comp* g;
comp* pComp;
comp tmp,tmp1,tmp2; i=;
do
{
i*=;
} while (i<N+M-);
L = i; h = (comp*)calloc(L,sizeof(comp));
g = (comp*)calloc(L,sizeof(comp));
pComp = (comp*)calloc(L,sizeof(comp)); for (i = ; i<N; i++)
{
tmp1 = cpow(A,-i);
tmp2 = cpow(W, i*i/2.0);
tmp = cmul(tmp1,tmp2);
g[i] = cmul(tmp,x[i]);
}
for (i = N;i<L; i++)
{
g[i] =czero();
} FFT(g,L,); for (i = ;i<=M-;i++)
{
h[i] = cpow(W, -i*i/2.0);
}
for (i=M; i<=L-N;i++)
{
h[i] =czero();
}
for (i = L-N+; i<=L;i++)
{
h[i] = cpow(W,-(L-i)*(L-i)/2.0);
} FFT(h,L,); for (i = ; i<L; i++)
{
pComp[i] = cmul(h[i],g[i]);
} FFT(pComp,L,-); //IDFT for (i = ; i<M;i++)
{
tmp = cpow(W,i*i/2.0);
xCZT[i] = cmul(tmp,pComp[i]);
} }

FFT.c

#include "FFT.h"

void FFT(comp *data,int FFTn,int inverse)
{
comp u,w,t;
double temp1,temp2;
double pi;
int i,j,k,l,ip;
int le,le1,m; pi=3.1415926f;
m=;
while(FFTn != (0x0001<<m)) m++;
for(i=,j=; i<FFTn-; i++)
{
if(i<j)
{
t=data[j];
data[j]=data[i];
data[i]=t;
}
k=FFTn/;
while(k<=j)
{
j-=k;
k/=;
}
j+=k;
}
le=;
for(l=; l<m; l++ )
{
le*=;
le1=le/;
u.re=(float)1.0;
u.im=(float)0.0;
w.re=(float)cos(pi/le1);
w.im=(float)(inverse*sin(pi/le1));
for(j=; j<le1; j++)
{
for(i=j; i<FFTn; i+=le)
{
ip=i+le1;
t.re=data[ip].re*u.re-data[ip].im*u.im;
t.im=data[ip].re*u.im+data[ip].im*u.re;
data[ip].re=data[i].re-t.re;
data[ip].im=data[i].im-t.im;
data[i].re+=t.re;
data[i].im+=t.im;
}
temp1=u.re;
temp2=u.im;
u.re=(float)(temp1*w.re-temp2*w.im);
u.im=(float)(temp1*w.im+temp2*w.re);
}
}
if(inverse>) return;
for(i=; i<FFTn; i++)
{
data[i].re/=FFTn;
data[i].im/=FFTn;
}
return;
}

FFT.h

#ifndef    _FFT1_H_
#define _FFT1_H_ #include "Complex.h"
//========================================
//功能: 实现FFT
//输入: data[in][out]: 数据指针; FFTn[in]:FFT点数;
// inverse[in]:正反FFT标志位:1,正FFT;-1,逆FFT
void FFT(comp *data,int FFTn,int inverse); #endif

二、仿真测试

参数设置:

结果对比:

  • matlab

  • C

利用CZT对信号进行频率估计:

频率细化直接查找:

仿真code:

clc;clear all;close all;
fs = 1000;
f0 = 201.3;
t = [0:199]/fs;
sig = (sin(2*pi*t*f0));
% %存入txt
% fp=fopen('data.txt','a');%'A.txt'为文件名;'a'为打开方式:在打开的文件末端添加数据,若文件不存在则创建。
% fprintf(fp,'%f ',sig);%fp为文件句柄,指定要写入数据的文件。注意:%d后有空格。
% fclose(fp);%关闭文件。 f1 = 190;
f2 = 210;
m = 100;
w = exp(-1j*2*pi*(f2-f1)/(m*fs));
a = exp(1j*2*pi*f1/fs);
y = czt(sig,m,w,a);
[val,pos] = max(abs(y));
fre_est = (pos-1)*(f2-f1)/m+f1;
y1 = fft(sig);
figure()
subplot 211
plot(linspace(f1,f2,length(y)),abs(y));
hold on;
scatter(fre_est,abs(y(pos)),'r*');
subplot 212
plot(t/max(t)*fs,abs(y1))

  C读取txt数据:

//
#include <stdio.h>
int n,r;
double d;
FILE *f;
void main() {
f=fopen("data.txt","r");
n=;
while () {
r=fscanf(f,"%lf",&d);
if (==r) {
n++;
printf("[%d]==%lg\n",n,d);
} else if (==r) {
fscanf(f,"%*c");
} else break;
}
fclose(f);
system("pause");
}

C语言仿真:

/*=============================
Chirp-Z Transform
=============================*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "Complex.h"
#include "FFT.h" #define Size 100 //信号长度 void CZT(comp* x, int N, comp A, comp W, comp *xCZT, int M); double max_ab(double x,double y);//求最大值 void main()
{
int i;
int r;
int N,M;
float da;
double fre_est;
FILE *f; double PI;
double A0,Theta0;
double W0,Phi0;
int pos;
double maxdata;
double maxcache;
float fs;
float fstart;
float fend;
comp* x;
double absx[Size];//存储绝对值
comp* xCZT;
comp A,W;
fs = 1000.0;//frequency sample
fstart = 200.0;
fend = 215.0;
PI = 3.1415926;
f=fopen("data.txt","r");
N = Size; //信号长度
M = Size; //chirp-z 变换输出长度
x = (comp *)calloc(N,sizeof(comp));
xCZT = (comp *)calloc(M,sizeof(comp));
for (i = ; i<N; i++) {
r=fscanf(f,"%f",&da); //读取数据
x[i].re = da;
x[i].im = 0.0;
printf("n = %f\n",x[i].re );
}
fclose(f); // A0 = 1.0; //起始抽样点z0的矢量半径长度
Theta0 = 2.0*PI*fstart/fs; //起始抽样点z0的相角
A.re = (float)(A0*cos(Theta0));
A.im = (float)(A0*sin(Theta0)); Phi0 = (fend-fstart)*2.0*PI/M/fs; //两相邻抽样点之间的角度差
W0 = 1.0; //螺线的伸展率
W.re = (float)(W0*cos(-Phi0));
W.im = (float)(W0*sin(-Phi0)); CZT(x,N,A,W,xCZT,M); printf("The Original Signal:\n");
for (i = ; i<N; i++)
{
absx[i] = sqrt(xCZT[i].re*xCZT[i].re + xCZT[i].im*xCZT[i].im);//频谱
printf("%10.4f",x[i].re);
printf("%10.4f\n",x[i].im);
} printf("The Chirp-Z Transfrom:\n");
for (i = ;i<M ;i++)
{
printf("%10.4f",xCZT[i].re);
printf("%10.4f\n",xCZT[i].im);
}
printf("The Chirp-Z Transfrom square:\n");
for (i = ;i<M ;i++)
{
printf("%lf\n",absx[i]);
}
//找出频谱峰值
maxcache = ;
pos = ;
for (i = ;i<M ;i++)
{
maxdata = max_ab(maxcache,absx[i]);
if (maxdata == absx[i]) pos++;
maxcache = maxdata;
}
//频率估计
fre_est = fstart + (pos-1.0)*(fend-fstart)/M;
printf("frequency estiamton: %lf",fre_est);
//绘制频谱
//
system("pause");
} /*
Function: max
*/
double max_ab(double x,double y)
{
return(x>y?x:y);
} /*----------------函数说明----------------------
Name: CZT
Function: Chirp-Z Transform
Para: x[in][out]:待变换信号 N[in]:信号长度
A[in]: W[in]:
M[in]:Chirp-Z变换输出长度
--------------------------------------------*/
void CZT(comp* x, int N, comp A, comp W, comp* xCZT, int M)
{
int i;
int L; comp* h;
comp* g;
comp* pComp;
comp tmp,tmp1,tmp2; i=;
do
{
i*=;
} while (i<N+M-);
L = i; h = (comp*)calloc(L,sizeof(comp));
g = (comp*)calloc(L,sizeof(comp));
pComp = (comp*)calloc(L,sizeof(comp)); for (i = ; i<N; i++)
{
tmp1 = cpow(A,-i);
tmp2 = cpow(W, i*i/2.0);
tmp = cmul(tmp1,tmp2);
g[i] = cmul(tmp,x[i]);
}
for (i = N;i<L; i++)
{
g[i] =czero();
} FFT(g,L,); for (i = ;i<=M-;i++)
{
h[i] = cpow(W, -i*i/2.0);
}
for (i=M; i<=L-N;i++)
{
h[i] =czero();
}
for (i = L-N+; i<=L;i++)
{
h[i] = cpow(W,-(L-i)*(L-i)/2.0);
} FFT(h,L,); for (i = ; i<L; i++)
{
pComp[i] = cmul(h[i],g[i]);
} FFT(pComp,L,-); //IDFT for (i = ; i<M;i++)
{
tmp = cpow(W,i*i/2.0);
xCZT[i] = cmul(tmp,pComp[i]);
} }

原始数据:

估计结果:

与MATLAB结果一致:

如果存在两个信号呢?

MATLAB

clc;clear all;close all;
fs = 256;
% f0 = 202;
% f1 = 208;
t = [0:625]/fs;
sig = single(2*cos(2*pi*102*t)+5*cos(2*pi*105*t));
%存入txt
fp=fopen('data.txt','a');%'A.txt'为文件名;'a'为打开方式:在打开的文件末端添加数据,若文件不存在则创建。
fprintf(fp,'%f\n',sig);%fp为文件句柄,指定要写入数据的文件。注意:%d后有空格。
fclose(fp);%关闭文件。 f1 = 100;
f2 = 108;
m = 625;
w = exp(-1j*2*pi*(f2-f1)/(m*fs));
a = exp(1j*2*pi*f1/fs);
y = czt(sig,m,w,a);
data_cache = diff(abs(y));
vals = abs(y);
dataall = [];
posall = [];
flag = 0;
for i = 1:length(y)-2
if ((data_cache(1,i)*data_cache(1,i+1))<0)
flag = flag + 1;
dataall = [ dataall vals(i)];
posall = [posall,i];
end
end [val,pos] = sort(dataall,'descend');
pos = posall(pos);
fre_est = (pos-1)*(f2-f1)/m+f1;
figure() y1 = fft(sig); subplot 211
plot(linspace(f1,f2,length(y)),abs(y));
axis([95,110,0,1500]);
hold on;
scatter(fre_est(1:2),ones(1,2),'r*');
hold on;
% scatter(fre_est,abs(y(pos)),'r*');
subplot 212
plot(t/max(t)*fs,abs(y1))
axis([95,110,0,1500]);

  C:

运行中如果报错:

需要将fopen的data.txt添加绝对路径,注意:\\而不是\。

/*=============================
Chirp-Z Transform
=============================*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "Complex.h"
#include "FFT.h" #define Size 626 //信号长度 void CZT(comp* x, int N, comp A, comp W, comp *xCZT, int M);
double max_ab(double x,double y);//求最大值 void main()
{
int i;
int r;
int flag = ;
int N,M;
float da;
double fre_est1, fre_est2;
FILE *f;
double datall[Size] = {};//新建足够大的数据
int posall[Size] = {};
double diffdata [Size-];
double PI;
double A0,Theta0;
double W0,Phi0;
int pos1,pos2;
double maxdata;
double maxcache;
float fs;
float fstart;
float fend;
comp* x;
double absx[Size];//存储绝对值
comp* xCZT;
comp A,W;
fs = 256.0;//frequency sample
fstart = 100.0;
fend = 108.0;
PI = 3.1415926;
f=fopen("data.txt","r");
N = Size; //信号长度
M = Size; //chirp-z 变换输出长度
x = (comp *)calloc(N,sizeof(comp));
xCZT = (comp *)calloc(M,sizeof(comp));
for (i = ; i<N; i++) {
r=fscanf(f,"%f",&da); //读取数据
x[i].re = da;
x[i].im = 0.0;
printf("n = %f\n",x[i].re );
}
fclose(f); // A0 = 1.0; //起始抽样点z0的矢量半径长度
Theta0 = 2.0*PI*fstart/fs; //起始抽样点z0的相角
A.re = (float)(A0*cos(Theta0));
A.im = (float)(A0*sin(Theta0)); Phi0 = (fend-fstart)*2.0*PI/M/fs; //两相邻抽样点之间的角度差
W0 = 1.0; //螺线的伸展率
W.re = (float)(W0*cos(-Phi0));
W.im = (float)(W0*sin(-Phi0)); CZT(x,N,A,W,xCZT,M); printf("The Original Signal:\n");
for (i = ; i<N; i++)
{
absx[i] = sqrt(xCZT[i].re*xCZT[i].re + xCZT[i].im*xCZT[i].im);//频谱
printf("%10.4f",x[i].re);
printf("%10.4f\n",x[i].im);
} printf("The Chirp-Z Transfrom:\n");
for (i = ;i<M ;i++)
{
printf("%10.4f",xCZT[i].re);
printf("%10.4f\n",xCZT[i].im);
}
printf("The Chirp-Z Transfrom square:\n");
//for (i = 0 ;i<M ;i++)
//{
// printf("%lf\n",absx[i]);
//}
//找出频谱峰值
//maxcache = 0;
//pos = 0;
//for (i = 0 ;i<M ;i++)
// {
// maxdata = max_ab(maxcache,absx[i]);
// if (maxdata == absx[i]) pos++;
// maxcache = maxdata;
// }
////频率估计
//fre_est = fstart + (pos-1.0)*(fend-fstart)/M;
//printf("frequency estiamton: %lf",fre_est);
//找第二个频率分量
for (i = ;i < M- ;i++)
{
diffdata[i] = absx[i+]-absx[i];
}
for (i = ;i < M- ;i++)
{
if((diffdata[i]*diffdata[i+])<0.0)
{
datall[flag] = absx[i];
posall[flag] = i;
flag ++;
}
}
maxcache = -;
pos1 = ;
for (i = ;i<flag ;i++)
{
maxdata = max_ab(maxcache,datall[i]);
if (maxdata == datall[i]) pos1 = i;
maxcache = maxdata;
} datall[pos1] = ;
maxcache = -;
pos2 = ;
for (i = ;i<flag ;i++)
{
maxdata = max_ab(maxcache,datall[i]);
if (maxdata == datall[i]) pos2 = i;
maxcache = maxdata;
}
fre_est1 = fstart + (posall[pos1]-1.0)*(fend-fstart)/M;
fre_est2 = fstart + (posall[pos2]-1.0)*(fend-fstart)/M;
printf("frequency estiamton: %lf and %lf",fre_est1,fre_est2);
//绘制频谱
//
system("pause");
} /*
Function: max
*/
double max_ab(double x,double y)
{
return(x>y?x:y);
} /*----------------函数说明----------------------
Name: CZT
Function: Chirp-Z Transform
Para:
x[in][out]:待变换信号
N[in]:信号长度
A[in]: W[in]:
M[in]:Chirp-Z变换输出长度
--------------------------------------------*/
void CZT(comp* x, int N, comp A, comp W, comp* xCZT, int M)
{
int i;
int L; comp* h;
comp* g;
comp* pComp;
comp tmp,tmp1,tmp2; i=;
do
{
i*=;
} while (i<N+M-);
L = i; h = (comp*)calloc(L,sizeof(comp));
g = (comp*)calloc(L,sizeof(comp));
pComp = (comp*)calloc(L,sizeof(comp)); for (i = ; i<N; i++)
{
tmp1 = cpow(A,-i);
tmp2 = cpow(W, i*i/2.0);
tmp = cmul(tmp1,tmp2);
g[i] = cmul(tmp,x[i]);
}
for (i = N;i<L; i++)
{
g[i] =czero();
} FFT(g,L,); for (i = ;i<=M-;i++)
{
h[i] = cpow(W, -i*i/2.0);
}
for (i=M; i<=L-N;i++)
{
h[i] =czero();
}
for (i = L-N+; i<=L;i++)
{
h[i] = cpow(W,-(L-i)*(L-i)/2.0);
} FFT(h,L,); for (i = ; i<L; i++)
{
pComp[i] = cmul(h[i],g[i]);
} FFT(pComp,L,-); //IDFT for (i = ; i<M;i++)
{
tmp = cpow(W,i*i/2.0);
xCZT[i] = cmul(tmp,pComp[i]);
} }

另外:quantusII有对应的DSP builder,Vivado/ISE是否有类似工具,直接代码转HDL? HLS算是一个,其他呢?有时间可以将*.c转成*.v试验

一个基本应用,频率精确测量:一种卫星信号载波频率精确估计算法.pdf

CZT变换(chirp z-transform)的更多相关文章

  1. 基本3D变换之World Transform, View Transform and Projection Transform

    作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 28 主题:World Transform, View Transform , Projection Transform 引言 ...

  2. 使用方向变换(directional transform)图像分块压缩感知

    论文的思路是先介绍分块压缩感知BCS,然后介绍使用投影和硬阈值方法的迭代投影方法PL,接着将PL与维纳滤波器结合形成SPL(平滑PL),并且介绍了稀疏表示的几种基,提出了两种效果较好的稀疏基:CT与D ...

  3. 介绍css 的3D 变换(3D transform)

    https://desandro.github.io/3dtransforms/docs/card-flip.html ---------------------------------------- ...

  4. 数字信号处理--Z变换,傅里叶变换,拉普拉斯变换

    傅立叶变换.拉普拉斯变换.Z变换最全攻略 作者:时间:2015-07-19来源:网络       傅立叶变换.拉普拉斯变换.Z变换的联系?他们的本质和区别是什么?为什么要进行这些变换.研究的都是什么? ...

  5. z 变换

    1. z 变换 单位脉冲响应为 \(h[n]\) 的离散时间线性时不变系统对复指数输入 \(z^n\) 的响应 \(y[n]\) 为 \[ \tag{1} y[n] = H(z) z^{n}\] 式中 ...

  6. CSS3之3d变换与关键帧

    3d变换是在transform基础上实现的 transform-style:preserve-3d; 建立3d空间 perspective:; 景深(设置用户看的距离) perspective-ori ...

  7. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换

    写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...

  8. 2017/11/25 2D变换

    2D变换 一.盒模型解析模式 1.box-sizing:盒模型解析模式 1)content-box:标准盒模型(和css2一样的计算) 宽度和高度之外绘制元素的内边距和边框 width,height外 ...

  9. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

随机推荐

  1. hdu 2364 Escape【模拟优先队列】【bfs】

    题目链接:https://vjudge.net/contest/184966#problem/A 题目大意: 走迷宫.从某个方向进入某点,优先走左或是右.如果左右都走不通,再考虑向前.绝对不能往后走, ...

  2. 浅析Linux服务器集群系统技术

    浅析Linux服务器集群系统技术 目录 前言 常用的服务器集群 集群系统的优势 LVS集群的通用体系结构 为什么使用层次的体系结构 为什么是共享存储 可伸缩Web服务 前言 总结两篇技术文章,努力学习 ...

  3. 001.Kubernetes简介

    一 Kubernetes概述 Kubernetes是一个全新的基于容器技术的分布式架构领先方案.Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Docker ...

  4. MongoDB+php7搭建

    0x00前言: 今天一位非计算机专业的朋友问我怎么打开.bson文件,我第一反应.bson文件是什么,网上查了下是mongodb的传输文件.也就是类似于mysql的.sql文件一样 之前看过mongo ...

  5. shell脚本中的set -e和set -o pipefail

    工作中经常在shell脚本中看到set的这两个用法,但就像生活中的很多事情,习惯导致忽视,直到出现问题才引起关注. 1. set -eset命令的-e参数,linux自带的说明如下:"Exi ...

  6. SpringBoot统一处理异常

    在springboot项目,报错有着默认的提示,这篇文章介绍一下如何统一处理异常. 新建项目,pom文件如下: <?xml version="1.0" encoding=&q ...

  7. 环形动画加载视图AnimatedCircleLoadingView​​​​​​​

    环形动画加载视图AnimatedCircleLoadingView AnimatedCircleLoadingView是基于Android手表动画android-watch-loading-anima ...

  8. Codeforces.612E.Square Root of Permutation(构造)

    题目链接 \(Description\) 给定一个\(n\)的排列\(p_i\),求一个排列\(q_i\),使得对于任意\(1\leq i\leq n\),\(q_{q_i}=p_i\).无解输出\( ...

  9. Python3之弹性力学——应力张量2

    问题 已知某应力张量的分量为 \[ \sigma_{11}=3,\quad\sigma_{12} = \sigma_{13} = 1, \quad \sigma_{22} = \sigma_{33} ...

  10. 多轴APM飞控调参

    调参步骤: 遥控器,电动机和电调对应的APM飞控连线——遥控器校准——电调行程校准——加速度计校准——磁罗盘校准——故障保护设定(遥控器和飞控)——飞行模式设定并调整——自动调参设定选项 APM飞控调 ...