【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)

摘要:
Tid=94547第36章FIR滤波器的Matlab设计(包括低通、36.1窗函数36.2 fir1函数36.2 fir2函数36.4)总结了36.1窗功能在数字信号处理中不可避免地使用数据拦截的问题。在滤波器设计中,遇到了拦截理想滤波器采样响应h(n)的问题,在功率谱估计中,还遇到拦截自相关函数的问题。使用窗函数将长序列转换为有限序列是不可避免的。

完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

第36章       FIR滤波器的Matlab设计(含低通,高通,带通和带阻)

本章节讲解FIR滤波器的Matlab设计。主要是函数fir1和fir2的使用。

36.1 窗函数

36.2 fir1函数

36.2 fir2函数

36.4 总结

36.1 窗函数

在数字信号处理中不可避免地要用到数据截取的问题。例如,在应用DFT的时候,数据x(n)总是有限长的,在滤波器设计中遇到了对理想滤波器抽样响应h(n)的截取问题,在功率谱估计中也要遇到对自相关函数的截取问题。总之,我们在实际工作中所能处理的离散序列总是有限长,把一个长序列变换成有限长的序列不可避免的要用到窗函数。因此,窗函数本身的研究及其应用是信号处理中的一个基本问题。

不同的窗函数对信号频谱的影响是不一样的,这主要是因为不同的窗函数,产生泄漏的大小不一样,频率分辨能力也不一样。信号的截断产生了能量泄漏,而用FFT算法计算频谱又产生了栅栏效应,从原理上讲这两种误差都是不能消除的,但是我们可以通过选择不同的窗函数对它们的影响进行抑制。(矩形窗主瓣窄,旁瓣大,频率识别精度最高,幅值识别精度最低;布莱克曼窗主瓣宽,旁瓣小,频率识别精度最低,但幅值识别精度最高)。

对于窗函数的选择,应考虑被分析信号的性质与处理要求。如果仅要求精确读出主瓣频率,而不考虑幅值精度,则可选用主瓣宽度比较窄而便于分辨的矩形窗,例如测量物体的自振频率等;如果分析窄带信号,且有较强的干扰噪声,则应选用旁瓣幅度小的窗函数,如汉宁窗、三角窗等;对于随时间按指数衰减的函数,可采用指数窗来提高信噪比

  •  矩形窗:

矩形窗属于时间变量的零次幂窗。矩形窗使用最多,习惯上不加窗就是使信号通过了矩形窗。这种窗的优点是主瓣比较集中,缺点是旁瓣较高,并有负旁瓣,导致变换中带进了高频干扰和泄漏,甚至出现负谱现象。

  •  三角窗:

三角窗亦称费杰(Fejer)窗,是幂窗的一次方形式。与矩形窗比较,主瓣宽约等于矩形窗的两倍,但旁瓣小,而且无负旁瓣。

  •  汉宁窗:

汉宁窗又称升余弦窗,汉宁窗可以看作是3个矩形时间窗的频谱之和,或者说是 3个 sinc(t)型函数之和,而括号中的两项相对于第一个谱窗向左、右各移动了 π/T,从而使旁瓣互相抵消,消去高频干扰和漏能。可以看出,汉宁窗主瓣加宽并降低,旁瓣则显著减小,从减小泄漏观点出发,汉宁窗优于矩形窗.但汉宁窗主瓣加宽,相当于分析带宽加宽,频率分辨力下降。

  •  海明窗:

海明窗也是余弦窗的一种,又称改进的升余弦窗。海明窗与汉宁窗都是余弦窗,只是加权系数不同。海明窗加权的系数能使旁瓣达到更小。分析表明,海明窗的第一旁瓣衰减为一42dB.海明窗的频谱也是由3个矩形时窗的频谱合成,但其旁瓣衰减速度为20dB/(10oct),这比汉宁窗衰减速度慢。海明窗与汉宁窗都是很有用的窗函数。

  •  高斯窗:

三角窗亦称费杰(Fejer)窗,是幂窗的一次方形式。与矩形窗比较,主瓣宽约等于矩形窗的两倍,但旁瓣小,而且无负旁瓣。

还有很多其它的窗口这里就不做介绍了,需更详细的了解的话,可以看matlab中help文档中的如下部分:

 【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)第1张

或者直接在命令窗口输入windowDesigner可以打开窗口工具:

 【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)第2张

打开后界面如下:

【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)第3张 

36.2 fir1函数

36.2.1 fir1函数介绍

函数fir1用来设计标准频率响应的基于窗函数的FIR滤波器,可实现加窗线性相位FIR滤波器设计。

语法:

b = fir1(n,Wn)

b = fir1(n,Wn,'ftype')

b = fir1(n,Wn,window)

b = fir1(n,Wn,'ftype',window)

b = fir1(...,'normalization')

其中,n:为了滤波器的阶数;

Wn:为滤波器的截止频率;

ftype:参数用来决定滤波器的类型,当ftype=high时,可设计高通滤波器,当ftype=stop时,可设计带阻滤波器。Window参数用来指导滤波器采用的窗函数类型。其默认值为汉明(Hamming)窗。

使用fir1函数可设计标准的低通,高通,带通和带阻滤波器。滤波器的系数包含在返回值b中,可表示为:

b(z) = b(1) + b(2)z-1 + …… +b(n+1)z-n

(1)  采用汉明窗设计低通FIR滤波器

使用b=fir1(n, Wn)可得到低通滤波器。其中, 0<=Wn<=1, Wn=1相当于0.5。其语法格式为

b=fir1(n, Wn)

(2)  采用汉明窗设计高通FIR滤波器

在b=fir1(n, Wn, 'ftype')中,当ftype=high时,可设计高通滤波器。其语法格式为

b=fir1(n, Wn, 'high')

(3)  采用汉明窗设计带通FIR滤波器

在b=fir1(n, Wn)中,当Wn=[W1  W2]时,fir1函数可得到带通滤波器,其通带为W1 < W < W2

W1 和 W2分别为通带的下限频率和上限频率。其语法格式为

b=fir1(n, [W1  W2])

(4)  采用汉明窗设计带阻FIR滤波器

在b = fir1(n,Wn,'ftype')中,当ftype=stop,Wn=[W1  W2]时,fir1函数可得到带阻滤波器,其语法格式为

b=fir1(n,  [W1  W2], 'stop')

(5)  采用其他窗口函数设计FIR滤波器

使用Window参数,可以用其他窗口函数设计出各种加窗滤波器,Window参数可采用的窗口函数有Boxcar,Hamming,Bartlett,Blackman,Kasier和Chebwin等。其默认时为Hamming窗。例如,采用Bartlett窗设计带阻滤波器,其语法结构为

b=fir1(n, [W1  W2], 'stop', Bartlett[n+1])

注意:用fir1函数设计高通和带阻滤波器时,所使用的阶数n应为偶数,当输入的阶数n为奇数时,fir1函数会自动将阶数增加1形成偶数。

36.2.2 fir1设计低通滤波器实例

下面我们通过一个实例来讲解fir1的用法。原始信号是由50Hz正弦波和200Hz的正弦波组成,将200Hz的正弦波当做噪声滤掉,下面通过函数fir1设计一组低通滤波器系数,其阶数是30,截止频率为0.25(也就是125Hz)。Matlab运行代码如下:

%****************************************************************************************
%                             FIR低通滤波器设计
%***************************************************************************************
fs=1000;                %设置采样频率 1k
N=1024;                %采样点数      
n=0:N-1;
t=0:1/fs:1-1/fs;          %时间序列
f=n*fs/N;               %频率序列

Signal_Original=sin(2*pi*50*t);      %信号50Hz正弦波
Signal_Noise=sin(2*pi*200*t);      %噪声200Hz正弦波

Mix_Signal=Signal_Original+Signal_Noise;  %将信号Signal_Original和Signal_Original合成一个信号进行采样               
subplot(221);
plot(t, Mix_Signal);   %绘制信号Mix_Signal的波形                                                 
xlabel('时间');
ylabel('幅值');
title('原始信号');
grid on;
  
subplot(222);
y=fft(Mix_Signal, N);     %对信号 Mix_Signal做FFT   
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
grid on;

b = fir1(30, 0.25);       %30阶FIR低通滤波器,截止频率125Hz
%y2= filter(b, 1, x);
y2=filtfilt(b,1,x);           %经过FIR滤波器后得到的信号
Ps=sum(Signal_Original.^2);          %信号的总功率
Pu=sum((y2-Signal_Original).^2);     %剩余噪声的功率
SNR=10*log10(Ps/Pu);               %信噪比

y3=fft(y2, N);            %经过FIR滤波器后得到的信号做FFT
subplot(223);                               
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('滤波后信号FFT');
grid on;

[H,F]=freqz(b,1,512);        %通过fir1设计的FIR系统的频率响应
subplot(224);
plot(F/pi,abs(H));           %绘制幅频响应
xlabel('归一化频率');        
title(['Order=',int2str(30),'    SNR=',num2str(SNR)]);
grid on;

Matlab的运行结果如下:

【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)第4张 

从运行结果的FFT和信噪比来看,滤波效果比较明显。

36.2.3 fir1设计高通滤波器实例

下面我们通过一个实例来讲解fir1的高通滤波器的用法。原始信号是由50Hz正弦波和200Hz的正弦波组成,将50Hz的正弦波当做噪声滤掉,下面通过函数fir1设计一组高通滤波器系数,其阶数是30,截止频率为0.25(也就是125Hz)。Matlab运行代码如下:

%****************************************************************************************
%                             FIR高通滤波器设计
%***************************************************************************************
fs=1000;                 %设置采样频率 1k
N=1024;                 %采样点数      
n=0:N-1;
t=0:1/fs:1-1/fs;           %时间序列
f=n*fs/N;                %频率序列

Signal_Original=sin(2*pi*200*t);   %信号200Hz正弦波
Signal_Noise=sin(2*pi*50*t);      %噪声50Hz正弦波

Mix_Signal=Signal_Original+Signal_Noise;      %将信号Signal_Original和Signal_Original合成一个信号进行采样               
subplot(221);
plot(t, Mix_Signal);   %绘制信号Mix_Signal的波形                                                 
xlabel('时间');
ylabel('幅值');
title('原始信号');
grid on;
  
subplot(222);
y=fft(Mix_Signal, N);     %对信号 Mix_Signal做FFT   
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
grid on;

b = fir1(30, 0.25, 'high');   %30阶FIR低通滤波器,截止频率125Hz
%y2= filter(b, 1, x);
y2=filtfilt(b,1,x);           %经过FIR滤波器后得到的信号
Ps=sum(Signal_Original.^2);           %信号的总功率
Pu=sum((y2-Signal_Original).^2);       %剩余噪声的功率
SNR=10*log10(Ps/Pu);                 %信噪比

y3=fft(y2, N);            %经过FIR滤波器后得到的信号做FFT
subplot(223);                               
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('滤波后信号FFT');
grid on;

[H,F]=freqz(b,1,512);        %通过fir1设计的FIR系统的频率响应
subplot(224);
plot(F/pi,abs(H));            %绘制幅频响应
xlabel('归一化频率');        
title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
grid on;

Matlab的运行结果如下:

【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)第5张 

从运行结果的FFT和信噪比来看,滤波效果比较明显。

36.2.4 fir1设计带通滤波器实例

下面我们通过一个实例来讲解fir1的带通滤波器的用法。原始信号是由50Hz正弦波和200Hz的正弦波组成,设计通带为125Hz到300Hz,下面通过函数fir1设计一组带通滤波器系数,其阶数是30,通带为0.25 < W <0.6。Matlab运行代码如下:

%****************************************************************************************
%                             FIR带通滤波器设计
%***************************************************************************************
fs=1000;                 %设置采样频率 1k
N=1024;                 %采样点数      
n=0:N-1;
t=0:1/fs:1-1/fs;           %时间序列
f=n*fs/N;                %频率序列

Signal_Original=sin(2*pi*200*t);     %信号200Hz正弦波
Signal_Noise=sin(2*pi*50*t);        %噪声50Hz正弦波

Mix_Signal=Signal_Original+Signal_Noise;      %将信号Signal_Original和Signal_Original合成一个信号进行采样               
subplot(221);
plot(t, Mix_Signal);   %绘制信号Mix_Signal的波形                                                 
xlabel('时间');
ylabel('幅值');
title('原始信号');
grid on;
  
subplot(222);
y=fft(Mix_Signal, N);     %对信号 Mix_Signal做FFT   
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
grid on;

b = fir1(30, [0.25 0.6]);   %30阶FIR低通滤波器,截止频率125Hz
%y2= filter(b, 1, x);
y2=filtfilt(b,1,x);           %经过FIR滤波器后得到的信号
Ps=sum(Signal_Original.^2);           %信号的总功率
Pu=sum((y2-Signal_Original).^2);       %剩余噪声的功率
SNR=10*log10(Ps/Pu);                 %信噪比

y3=fft(y2, N);            %经过FIR滤波器后得到的信号做FFT
subplot(223);                               
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('滤波后信号FFT');
grid on;

[H,F]=freqz(b,1,512);        %通过fir1设计的FIR系统的频率响应
subplot(224);
plot(F/pi,abs(H));            %绘制幅频响应
xlabel('归一化频率');        
title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
grid on;

Matlab运行结果如下:

【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)第6张 

从运行结果的FFT和信噪比来看,滤波效果比较明显。

36.2.5 fir1设计带阻滤波器实例

下面我们通过一个实例来讲解fir1的带阻滤波器的用法。原始信号是由50Hz正弦波和200Hz的正弦波组成,设计阻带为125Hz到300Hz,下面通过函数fir1设计一组带阻滤波器系数,其阶数是30,阻带为0.25 < W <0.6。Matlab运行代码如下:

%****************************************************************************************
%                             FIR带阻滤波器设计
%***************************************************************************************
fs=1000;                 %设置采样频率 1k
N=1024;                 %采样点数      
n=0:N-1;
t=0:1/fs:1-1/fs;           %时间序列
f=n*fs/N;                %频率序列

Signal_Original=sin(2*pi*50*t);     %信号50Hz正弦波
Signal_Noise=sin(2*pi*200*t);      %噪声200Hz正弦波

Mix_Signal=Signal_Original+Signal_Noise;      %将信号Signal_Original和Signal_Original合成一个信号进行采样               
subplot(221);
plot(t, Mix_Signal);   %绘制信号Mix_Signal的波形                                                 
xlabel('时间');
ylabel('幅值');
title('原始信号');
grid on;
  
subplot(222);
y=fft(Mix_Signal, N);     %对信号 Mix_Signal做FFT   
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
grid on;

b = fir1(30, [0.25 0.6], 'stop');   %30阶FIR低通滤波器,截止频率125Hz
%y2= filter(b, 1, x);
y2=filtfilt(b,1,x);               %经过FIR滤波器后得到的信号
Ps=sum(Signal_Original.^2);   %信号的总功率
Pu=sum((y2-Signal_Original).^2);     %剩余噪声的功率
SNR=10*log10(Ps/Pu);               %信噪比

y3=fft(y2, N);            %经过FIR滤波器后得到的信号做FFT
subplot(223);                               
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('滤波后信号FFT');
grid on;

[H,F]=freqz(b,1,512);        %通过fir1设计的FIR系统的频率响应
subplot(224);
plot(F/pi,abs(H));            %绘制幅频响应
xlabel('归一化频率');        
title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
grid on;

Matlab运行结果如下:

【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)第7张 

从运行结果的FFT和信噪比来看,滤波效果比较明显。

36.2.6 切比雪夫窗口函数设计带通滤波器实例

下面我们通过一个实例来讲解fir1设计切比雪夫窗口的的带通滤波器。原始信号是由50Hz正弦波和200Hz的正弦波组成,设计通带为125Hz到300Hz,下面通过函数fir1设计一组带通滤波器系数,其阶数是30,通带为0.25 < W <0.6,并且具有25db波纹的切比雪夫窗。Matlab运行代码如下:

%****************************************************************************************
%                             切比雪夫窗口函数设计带通滤波器
%***************************************************************************************
fs=1000;                 %设置采样频率 1k
N=1024;                 %采样点数      
n=0:N-1;
t=0:1/fs:1-1/fs;           %时间序列
f=n*fs/N;                %频率序列

Signal_Original=sin(2*pi*200*t);     %信号200Hz正弦波
Signal_Noise=sin(2*pi*50*t);      %噪声50Hz正弦波

Mix_Signal=Signal_Original+Signal_Noise;      %将信号Signal_Original和Signal_Original合成一个信号进行采样               
subplot(221);
plot(t, Mix_Signal);   %绘制信号Mix_Signal的波形                                                 
xlabel('时间');
ylabel('幅值');
title('原始信号');
grid on;
  
subplot(222);
y=fft(Mix_Signal, N);     %对信号 Mix_Signal做FFT   
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
grid on;

Window = chebwin(31, 25);           %25db的切比雪夫窗
b = fir1(30, [0.25 0.6], Window);   %30阶FIR低通滤波器,截止频率125Hz
%y2= filter(b, 1, x);
y2=filtfilt(b,1,x);           %经过FIR滤波器后得到的信号
Ps=sum(Signal_Original.^2);           %信号的总功率
Pu=sum((y2-Signal_Original).^2);       %剩余噪声的功率
SNR=10*log10(Ps/Pu);                 %信噪比

y3=fft(y2, N);            %经过FIR滤波器后得到的信号做FFT
subplot(223);                               
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('滤波后信号FFT');
grid on;

[H,F]=freqz(b,1,512);        %通过fir1设计的FIR系统的频率响应
subplot(224);
plot(F/pi,abs(H));            %绘制幅频响应
xlabel('归一化频率');        
title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
grid on;

Matlab运行结果如下:

【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)第8张 

通过归一化频率可以看出切比雪夫窗口是有一定纹波的。不过从FFT结果和信噪比来看,通过切比雪夫窗口做的滤波效果也是比较明显的。

36.3 fir2函数

36.3.1 fir2函数介绍

函数fir2用来设计有任意频率响应的各种加窗FIR滤波器。

语法:

b = fir2(n,f,m)

b = fir2(n,f,m,window)

b = fir2(n,f,m,npt)

b = fir2(n,f,m,npt,window)

b = fir2(n,f,m,npt,lap)

b = fir2(n,f,m,npt,lap,window)

参数n为滤波器的阶数。

参数f为频率点矢量,且f[0, 1], f=1对应于0.5fs。矢量f按升序排列,且第一个元素必须为0,最后一个必须为1,并可以包含重复的频率点。

参数m为幅度点矢量,在矢量m中包含了与f相对应的期望得到的滤波器幅度。

参数Window用来指导所使用的窗函数类型,其默认值为汉明窗。

参数npt用来指定fir2函数对频率响应进行内插的点数。

参数lap用来指定fir2函数在重复频率点附近插入的区域大小。

36.3.2 fir2设计低通滤波器

fir2函数是用来设计任意频率响应的各种加窗FIR滤波器,此函数使用也比较简单,但是要采样的频率点和幅值不好把握,关于这个函数我们仅提供一个低通滤波器的设计。

原始信号是由50Hz正弦波和200Hz的正弦波组成,将200Hz的正弦波当做噪声滤掉,下面通过函数fir2进行设计。其中频率点矢量和幅度点矢量配置如下:

F = [0 0.1  0.2  0.3  0.4 0.5  0.6  0.7  0.8  1];

A = [1  1  1    1     0 0    0   0    0    0];  

Matlab运行的代码如下:

%****************************************************************************************
%                            fir2设计低通滤波器
%***************************************************************************************
fs=1000;                 %设置采样频率 1k
N=1024;                 %采样点数      
n=0:N-1;
t=0:1/fs:1-1/fs;           %时间序列
f=n*fs/N;                %频率序列

Signal_Original=sin(2*pi*50*t);     %信号50Hz正弦波
Signal_Noise=sin(2*pi*200*t);      %噪声200Hz正弦波

Mix_Signal=Signal_Original+Signal_Noise;      %将信号Signal_Original和Signal_Original合成一个信号进行采样               
subplot(221);
plot(t, Mix_Signal);   %绘制信号Mix_Signal的波形                                                 
xlabel('时间');
ylabel('幅值');
title('原始信号');
grid on;
  
subplot(222);
y=fft(Mix_Signal, N);     %对信号 Mix_Signal做FFT   
plot(f,abs(y));
xlabel('频率/Hz');
ylabel('振幅');
title('原始信号FFT');
grid on;

F = [0 0.1  0.2  0.3  0.4 0.5  0.6  0.7  0.8  1];  %表示要采样的点
A = [1  1     1     1     0    0     0     0     0     0];   %表示采样点的幅值
b = fir2(30, F, A);   %30阶FIR低通滤波器
%y2= filter(b, 1, x);
y2=filtfilt(b,1,x);           %经过FIR滤波器后得到的信号
Ps=sum(Signal_Original.^2);           %信号的总功率
Pu=sum((y2-Signal_Original).^2);       %剩余噪声的功率
SNR=10*log10(Ps/Pu);                 %信噪比

y3=fft(y2, N);            %经过FIR滤波器后得到的信号做FFT
subplot(223);                               
plot(f,abs(y3));
xlabel('频率/Hz');
ylabel('振幅');
title('滤波后信号FFT');
grid on;

[H,F]=freqz(b,1,512);        %通过fir1设计的FIR系统的频率响应
subplot(224);
plot(F/pi,abs(H));            %绘制幅频响应
xlabel('归一化频率');        
title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
grid on;

Matlab运行结果如下:

【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)第9张 

从FFT结果和信噪比来看,fir2任意滤波器设计效果也是比较明显的。

36.4 总结

本章节主要讲解了函数fir1和函数fir2的使用,想深入的掌握这两个函数,还需要大家多多练习。

免责声明:文章转载自《【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇tcpip详解笔记(6) icmp协议关于控件的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Lodash学习笔记

有多年开发经验的工程师,往往都会有自己的一套工具库,称为utils、helpers等等,这套库一方面是自己的技术积累,另一方面也是对某项技术的扩展,领先于技术规范的制订和实现。 Lodash就是这样的一套工具库,它内部封装了诸多对字符串、数组、对象等常见数据类型的处理函数,其中部分是目前ECMAScript尚未制订的规范,但同时被业界所认可的辅助函数。莫倩...

.net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)

最近在网上查了一下表达工计算器的类库,发现Java版本的有一个比较成熟的叫W3EVal,好像是一个IBM工程师写的,.net就很少了(可能是我了解不够多),但投机取巧的实现思路有很多,比如:  (1)将Javasript中代码编译成.net类库,利用Javascript中的eval函数来实现;  (2)利用ScriptControl执行JavaScript...

Python 中全局变量的实现

一、概述 Python 中全局变量的使用场景不多,但偶尔也有用武之处。 如在函数中的初始化,有时需要从外部传入一个全局变量加以控制。或者在函数中,使用连接池时,也可能有使用全局变量的需要。 广义上的全局变量有以下两种: 使用 global 进行修饰 使用复合数据类型,如类、列表、数组等 有点类似 Java 中的 Final 变量,Final 变量是一旦...

【网易官方】极客战记(codecombat)攻略-森林-金属探测器metal-detector

如果黄金遇上食人魔,食人魔将跑向黄金。 简介 那个食人魔营地受到很好的保护,但是我们可以减少食人魔的数量。 我们把大炮藏在森林里,准备金币。 我们的计划很简单:一枚硬币出现了,一个怪物在为硬币奔跑,我们向硬币射击,完成了。 你的任务是做测距仪。等一枚硬币,然后 say``distanceTo() 硬币。 默认代码 # 炮兵使用硬币作为目标。 # 你将...

css3中的width:100vh以及calc(100vh + 10px)

转自:https://blog.csdn.net/qq_24581629/article/details/72377300 vh/vw    vh: 相对于视窗的高度, 视窗被均分为100单位的vh;   vw: 相对于视窗的宽度, 视窗被均分为100单位的vw;   vmax: 相对于视窗的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vma...

CSS函数使用,里面有clip-path使用画各种多边形的原理和示例哦

css函数:指复杂类型或调用特殊处理的组件值类型,在css中,只要带有()的属性都是函数。 相信大家都多多少少都用过一些如rgb()/rgba()/url()等等,其实呢,W3C里面有很多的并且比较好用的css函数。本章博文就是整理了一些常用的使用的函数,方便记忆及以后的开发使用。 颜色函数:(HEX为16进制展示颜色如#eee)   rgb()、rgba...