经典功率谱估计及Matlab仿真

 原文出自:http://www.cnblogs.com/jacklu/p/5140913.html

功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理、故障诊断等实际工程中。本文给出了经典功率谱估计的几类方法,并通过Matlab的实验仿真对经典功率谱估计方法性能进行了分析,最后说明了经典功率谱估计法的局限性和造成这种局限性的原因。

1.引言

给定一个标准的正弦信号,我们可以通过傅里叶变换来分析它的频率成分。然而,实际工程应用中,由于存在着各种干扰、噪声,我们得到的信号往往不是理想的,如图1-1这种信号,具有不确定性,幅度不能预知,非周期,但往往服从一定的统计特性,这种信号叫作随机信号。需要注意的是,本文所说的随机信号是指平稳各态遍历的随机信号,关于非平稳随机信号的分析方法[1]本文不予讨论。

图1-1 一种随机信号时域形式

 

对于图1-1的随机信号,我们可以通过功率谱来分析它的频率成分,如图1-2所示为图1-1随机信号的功率谱。实际过程中,我们只能获得随机信号的一些离散数据点(假设为N个),本文将讨论如何利用这N个数据点,来得到一个"非精确"的功率谱来对真实随机信号的功率谱进行估计,并讨论如何更好的估计,即在下一章要讲述的几个经典的功率谱估计法。

图1-2 上图所示的随机信号功率谱

2.经典功率谱估计法

上一章我们已经知道功率谱估计法是通过利用已经获得的N个数据点,来得到一个"非精确"的功率谱对真实随机信号的功率谱进行估计,所以在给出具体的方法之前,如何来评价我们得出的这个"非精确"的功率谱的好坏呢?

评价功率谱性能好坏的标准有很多,本文只给出两个影响最大的标准:分辨率和方差。分辨率即功率谱上能够区分的最小相邻频率成分,分辨率越高,我们观察信号的频率成分越清晰;方差大小则反映到功率谱波动性的大小,如果方差太大,功率谱波动性大,则很容易造成有用的频率成分被噪声淹没。所以,我们希望得到的这个"非精确"的功率谱,分辨率越高越好,方差越小越好。

同时,我们给出概率论与数理统计中所学的一致估计和非一致估计的概念,假定真实信号的功率谱为,估计得到的"非精确"功率谱为,如果满足公式(2-1),则称为一致估计。

                                         2-1

2.1周期图法

2.1.1周期图法原理

我们已知N个离散的数据点,对这些数据点进行傅里叶变换,得到式(2-2): (2-2)

再对(2-2)式取模的平方,除以N,即得到一个"非精确"的谱,如式(2-3)所示,这就是周期图法的原理。

(2-3)

2.1.2周期图法性能(Matlab仿真)

上一小节我们已经给出了周期图法的原理。本节将通过Matlab仿真给出数据点数N对功率谱性能好坏的影响,正如上文所述,将通过对所得功率谱的分辨率和方差两方面进行分析。

我们在Matlab中通过三个正弦函数和白噪声叠加,构造了一个随机信号。其数学形式如式(2-4),其中频率,幅值,相位为相互独立在上服从均匀分布随机相位,为均值为0,方差为1的实值高斯白噪声,采样频率为1000。信号的时域形式如图2-1所示。

(2-4)

图2-1 实验所用的随机信号

 

当数据点数N分别为128、256、512和1024时,得到的功率谱分别如图2-2、图2-3、图2-4和图2-5所示。分辨率能够直观的通过功率谱图形看出,方差的数值由表2-1给出。

 

图2-2 N=128时周期图法得到的功率谱

 

图2-3 N=256时周期图法得到的功率谱

 

图2-4 N=512时周期图法得到的功率谱

 

图2-5 N=1024时周期图法得到的功率谱

 

表2-1 不同N值得到功率谱的方差值

N

128

256

512

1024

方差

92.7108

130.9109

160.9187

483.5894

 

通过上面实验结果的比较,我们很容易发现,周期图法得到的功率谱随着数据点数N的增大,分辨率变大、方差变也大。

2.1.3平均周期图法

周期图法得到的功率谱与我们所期望的"分辨率大、方差小"是矛盾的。为了进一步降低方差,将N个观测样本数据点分为L段,每段数据长度为M, 分别对每段数据求周期图功率谱估计,然后求平均值,这种方法称平均周期图法。

那么这种方法会如何改善方差呢?我们给出证明: (2-5)

其中:

2-6

由式(2-5)我们可以看出,平均周期图法将原来的方差变为原来的,L为分段数。

2.1.4平均周期图法性能(Matlab仿真)

当数据点数N为1024,分段数分别为8、4、2时,平均周期图法得到的功率谱分别如图2-6、图2-7、图2-8所示。分辨率能够直观的通过功率谱图形看出,方差的数值由表2-2给出。

 

图2-6 L=8时平均周期图法得到的功率谱

 

图2-7 L=4时平均周期图法得到的功率谱

 

图2-8 L=2时平均周期图法得到的功率谱

 

表2-2 不同L值得到功率谱的方差值

L

8

4

2

1

方差

96.3756

190.9647

400.6464

483.5894

 

L=1时,平均周期图法退化为周期图法。通过上面实验结果的比较,我们很容易发现,平均周期图法得到的功率谱随着分段数L变大,方差变小,但分辨率变小。

当观测样本序列数据个数N固定时,要降低方差需要增加分段数L。当N不大时分段长度M取值较小,则功率谱分辨率降低到较低的水平。若分段数L固定时,增加分辨率需要分段长度M,则需要采集到更长的检测数据序列。实际中恰恰是检测样本序列长度不足。

2.1.5修正的平均周期图法

上一节已经提到实际中检测样本序列长度是有限的。对现有数据长度N,如果能获得更多的段数分割,将会得到更小的方差。允许数据段间有重叠部分,来得到更多的段数。对段间重叠长度的选取,最简单是取为段长度M的一半。由式(2-5)可知更多的段数可以进一步降低方差。

数据截断的过程中相当于数据加矩形窗,矩形窗幅度较大的旁瓣会造成"频谱泄漏"。我们分段时采取的窗函数更为多样(三角窗,海明窗等), 以减小截断数据(加矩形窗)窗函数带来的影响[2]

2.1.6修正的平均周期图法性能(Matlab仿真)

利用修正平均周期图法,分别使用矩形窗、Blackman窗和Hamming窗得到的功率谱如图2-9所示。

 

图2-9 不同窗函数的修正平均周期图法得到的功率谱

 

可以发现,矩形窗的分辨率最高,但是方差也最大,这是由于矩形窗频谱主瓣最窄,分辨率因此最高,旁瓣也高,导致频谱泄漏最严重,方差最大。

2.1.7总结

周期图法获得的功率谱随着样本点数越多,分辨率越大、方差越大;平均周期图法以牺牲分辨率来进一步改善方差;修正的平均周期图法允许段的重叠来进一步增大分段数、或者分段数相同,每段样本点数变多。无论是哪种方法都没有彻底结局方差与分辨率之间的矛盾。

2.2相关功率谱估计法-BT

正如我们之前介绍的,要提高功率谱估计的分辨率,必须增加数据序列的长度N,但是较长的数据序列,由噪声引起的随机性得到更为充分的体现-较大的方差。事实上,当N无穷大时,方差为一非零常数。即周期图法无法实现功率谱的一致估计。而这节讲述的相关功率谱估计法(下文称作BT法),是一致估计。

2.2.1 BT法的原理

维纳辛钦定理指出,随机信号的相关函数与它的功率谱是一对傅里叶变换对。BT法就是基于这个原理。先由观测数据估计出自相关函数,然后求自相关函数的傅立叶变换,以此变换作为对功率谱的估计,也称为间接法。BT法要求信号长度N以外的信号为零,这也造成BT法的局限性。

的自相关函数定义如式(2-7)所示,得到的功率谱记为,则BT法可以表述为式(2-8)。

2-7

(2-8)

2.2.2 BT法的性能(Matlab仿真)

数据点数N分别为128、256、512和1024的BT法,得到的功率谱如图2-10、图2-11、图2-12和图2-13所示。

 

图2-10 N=128时,BT法得到的功率谱

 

图2-11 N=256时,BT法得到的功率谱

 

图2-12 N=512时,BT法得到的功率谱

 

图2-13 N=1024时,BT法得到的功率谱

 

由上面实验可以发现,M随着N的增大而增大时,分辨率提高,方差变大。BT法仍然没有解决分辨率与方差之间的矛盾,但是BT法得到的功率谱当N为无穷大时,方差会趋向于零,即为一致估计[2]

2.2.3 周期图法与BT法的关系

相关函数可以写成如式(2-9)的卷积形式: (2-9

设序列的傅立叶变换为,则当M=N-1时,功率谱的估计可表示为式(2-10)的形式。可以看出周期图法可以看作BT法在取M=N-1时的特例。

 2-10

结 论

本文通过Matlab仿真,以一个具体的随机信号为例,简单介绍了周期图法、平均周期图法、修正的平均周期图法以及BT法的基本原理,并对这些方法的性能进行分析。可以看出,无论是周期图法及其改进算法还是BT法都没有从根本上解决分辨率与方差的矛盾。经典功率谱估计是利用傅里叶变换估计功率谱,而我们之前分析随机信号不满足傅里叶变换的条件,所以经典功率谱估计方法不得不从无限长数据点截取有限长数据点,加入限制条件(周期图法实际上假定N点外数据周期重复、BT法假定N点外数据为零)来"强制"作傅里叶变换,这也是造成它局限性的原因。

参考资料

[1] 朱哲,钟宏伟. 非平稳随机信号分析处理方法研究[J] 安徽电子信息技术学院学 2008.6:28-28

[2] 皇甫堪. 现代数字信号处理[M]. 电子工业出版社

 部分matlab程序代码:

周期图法:(by宋同学)

 1 Fs=1000;
 2 f1=50;
 3 f2=125;
 4 f3=135;
 5 N=128;
 6 Nfft=N;
 7 n=0:N-1;
 8 t=n/Fs;%采用的时间序列
 9 xn=cos(2*pi*f1*t)+1.5*cos(2*pi*f2*t)+cos(2*pi*f3*t)+1.5*randn(size(n));
10 figure;
11 plot(n,xn);grid on;title('时域信号');
12 P=10*log10(abs(fft(xn,Nfft).^2)/N);%Fourier振幅谱平方的平均值,并转化为dB
13 f=(0:length(P)-1)*Fs/length(P);%给出频率序列
14 figure;
15 plot(f(1:N/2),P(1:N/2));grid on;title('功率谱(dB图)');ylabel('功率谱/dB');
16 xlabel('频率/Hz');
17 Pxx=abs(fft(xn,Nfft).^2)/N;%Fourier振幅谱平方的平均值,并转化为dB
18 f=(0:length(Pxx)-1)*Fs/length(Pxx);%给出频率序列
19 figure;
20 plot(f(1:N/2),Pxx(1:N/2));%绘制功率谱曲线
21 xlabel('频率/Hz');ylabel('功率谱');
22 title('周期图 N=128');grid on;
23 std(Pxx)^2
24 
25 N=256;
26 Nfft=N;
27 n=0:N-1;
28 t=n/Fs;%采用的时间序列
29 xn=cos(2*pi*f1*t)+1.5*cos(2*pi*f2*t)+cos(2*pi*f3*t)+1.5*randn(size(n));
30 figure;
31 plot(n,xn);grid on;title('时域信号');
32 P=10*log10(abs(fft(xn,Nfft).^2)/N);%Fourier振幅谱平方的平均值,并转化为dB
33 f=(0:length(P)-1)*Fs/length(P);%给出频率序列
34 figure;
35 plot(f(1:N/2),P(1:N/2));grid on;title('功率谱(dB图)');ylabel('功率谱/dB');
36 xlabel('频率/Hz');
37 Pxx=abs(fft(xn,Nfft).^2)/N;%Fourier振幅谱平方的平均值,并转化为dB
38 f=(0:length(Pxx)-1)*Fs/length(Pxx);%给出频率序列
39 figure;
40 plot(f(1:N/2),Pxx(1:N/2));%绘制功率谱曲线
41 xlabel('频率/Hz');ylabel('功率谱');
42 title('周期图 N=256');grid on;
43 std(Pxx)^2
44 
45 N=512;
46 Nfft=N;
47 n=0:N-1;
48 t=n/Fs;%采用的时间序列
49 xn=cos(2*pi*f1*t)+1.5*cos(2*pi*f2*t)+cos(2*pi*f3*t)+1.5*randn(size(n));
50 figure;
51 plot(n,xn);grid on;title('时域信号');
52 P=10*log10(abs(fft(xn,Nfft).^2)/N);%Fourier振幅谱平方的平均值,并转化为dB
53 f=(0:length(P)-1)*Fs/length(P);%给出频率序列
54 figure;
55 plot(f(1:N/2),P(1:N/2));grid on;title('功率谱(dB图)');ylabel('功率谱/dB');
56 xlabel('频率/Hz');
57 Pxx=abs(fft(xn,Nfft).^2)/N;%Fourier振幅谱平方的平均值,并转化为dB
58 f=(0:length(Pxx)-1)*Fs/length(Pxx);%给出频率序列
59 figure;
60 plot(f(1:N/2),Pxx(1:N/2));%绘制功率谱曲线
61 xlabel('频率/Hz');ylabel('功率谱');
62 title('周期图 N=512');grid on;
63 std(Pxx)^2
64 
65 N=1024;
66 Nfft=N;
67 n=0:N-1;
68 t=n/Fs;%采用的时间序列
69 xn=cos(2*pi*f1*t)+1.5*cos(2*pi*f2*t)+cos(2*pi*f3*t)+1.5*randn(size(n));
70 figure;
71 plot(n(1:1000),xn(1:1000));grid on;title('时域信号');
72 P=10*log10(abs(fft(xn,Nfft).^2)/N);%Fourier振幅谱平方的平均值,并转化为dB
73 f=(0:length(P)-1)*Fs/length(P);%给出频率序列
74 figure;
75 plot(f(1:N/2),P(1:N/2));grid on;title('功率谱(dB图)');ylabel('功率谱/dB');
76 xlabel('频率/Hz');
77 Pxx=abs(fft(xn,Nfft).^2)/N;%Fourier振幅谱平方的平均值,并转化为dB
78 f=(0:length(Pxx)-1)*Fs/length(Pxx);%给出频率序列
79 figure;
80 plot(f(1:N/2),Pxx(1:N/2));%绘制功率谱曲线
81 xlabel('频率/Hz');ylabel('功率谱');
82 title('周期图 N=1024');grid on;
83 std(Pxx)^2


平均周期图法

 1 clear;
 2 Fs=1000;
 3 f1=50;
 4 f2=125;
 5 f3=135;
 6 n=0:1/Fs:1;
 7 xn=cos(2*pi*f1*n)+1.5*cos(2*pi*f2*n)+cos(2*pi*f3*n)+1.5*randn(size(n));
 8 
 9 N=1024;Nsec=512;%数据的长度和FFT所用的数据长度
10 Pxx1=abs(fft(xn(1:512),Nsec).^2)/Nsec; %第一段功率谱
11 Pxx2=abs(fft(xn(513:1000),Nsec).^2)/Nsec;%第二段功率谱
12 Pxx=10*log10((Pxx1+Pxx2)/2);%Fourier振幅谱平方的平均值,并转化为dB
13 (std((Pxx1+Pxx2)/2))^2
14 f=(0:length(Pxx)-1)*Fs/length(Pxx);%给出频率序列
15 figure;
16 plot(f(1:Nsec/2),Pxx(1:Nsec/2));%绘制功率谱曲线
17 xlabel('频率/Hz');ylabel('功率谱/dB');
18 title('N=2*512');grid on;
19 
20 N=1024;Nsec=256;%数据的长度和FFT所用的数据长度
21 Pxx1=abs(fft(xn(1:256),Nsec).^2)/Nsec; %第一段功率谱
22 Pxx2=abs(fft(xn(257:512),Nsec).^2)/Nsec;%第二段功率谱
23 Pxx3=abs(fft(xn(513:768),Nsec).^2)/Nsec;%第三段功率谱
24 Pxx4=abs(fft(xn(769:1000),Nsec).^2)/Nsec;%第四段功率谱
25 Pxx=10*log10((Pxx1+Pxx2+Pxx3+Pxx4)/4);%Fourier振幅谱平方的平均值,并转化为dB
26 std((Pxx1+Pxx2+Pxx3+Pxx4)/4)^2
27 f=(0:length(Pxx)-1)*Fs/length(Pxx);%给出频率序列
28 figure;
29 plot(f(1:Nsec/2),Pxx(1:Nsec/2));%绘制功率谱曲线
30 xlabel('频率/Hz');ylabel('功率谱/dB');
31 title('N=4*256');grid on;
32 
33 N=1024;Nsec=128;%数据的长度和FFT所用的数据长度
34 Pxx1=abs(fft(xn(1:128),Nsec).^2)/Nsec; %第一段功率谱
35 Pxx2=abs(fft(xn(129:256),Nsec).^2)/Nsec;%第二段功率谱
36 Pxx3=abs(fft(xn(257:384),Nsec).^2)/Nsec;%第三段功率谱
37 Pxx4=abs(fft(xn(385:512),Nsec).^2)/Nsec;%第四段功率谱
38 Pxx5=abs(fft(xn(513:640),Nsec).^2)/Nsec; %第五段功率谱
39 Pxx6=abs(fft(xn(641:768),Nsec).^2)/Nsec;%第六段功率谱
40 Pxx7=abs(fft(xn(769:896),Nsec).^2)/Nsec;%第七段功率谱
41 Pxx8=abs(fft(xn(897:1000),Nsec).^2)/Nsec;%第八段功率谱
42 Pxx=10*log10((Pxx1+Pxx2+Pxx3+Pxx4+Pxx5+Pxx6+Pxx7+Pxx8)/8);%Fourier振幅谱平方的平均值,并转化为dB
43 std((Pxx1+Pxx2+Pxx3+Pxx4+Pxx5+Pxx6+Pxx7+Pxx8)/8)^2
44 
45 f=(0:length(Pxx)-1)*Fs/length(Pxx);%给出频率序列
46 figure;
47 plot(f(1:Nsec/2),Pxx(1:Nsec/2));%绘制功率谱曲线
48 xlabel('频率/Hz');ylabel('功率谱/dB');
49 title('N=8*128');grid on;

修正的平均周期图法(by周同学)

 1 clear;%求1024点功率谱以及方差
 2 Fs=1000;
 3 f1=50;
 4 f2=125;
 5 f3=135;
 6 n=0:1/Fs:1;
 7 xn=cos(2*pi*f1*n)+1.5*cos(2*pi*f2*n)+cos(2*pi*f3*n)+1.5*randn(size(n));
 8 M=512;N=1024;%数据总点数1024,每段长度M
 9 window=hamming(M);
10 Pxxtotal=0;
11 L=N/(M/2)-1;
12 for i=1:1:(L-1)
13     m=abs(fft(window'.*(xn((M/2+M/2*i-M+1):(M/2+M/2*i))),M).^2)/M;
14     Pxxtotal=Pxxtotal+m;
15 end
16 window=hamming(Fs-(N-M+1)+1);
17 mend=abs(fft(window'.*(xn((N-M+1):Fs)),M).^2)/M;
18 Pxxtotal=(Pxxtotal+mend)/L;
19 Pxx=10*log10((Pxxtotal));%Fourier振幅谱平方的平均值,并转化为dB
20 f=(0:length(Pxx)-1)*Fs/length(Pxx);%给出频率序列
21 w1=fft(window,N);
22 w10=abs(fftshift(w1));
23 
24 plot(f(1:M/2),Pxx(1:M/2));%绘制功率谱曲线
25 xlabel('频率/Hz');ylabel('功率谱/dB');
26 grid on;
27 B=var(Pxxtotal)

BT法(by阳同学)

 1 Fs=1000;
 2 n=0:1/Fs:1;
 3 x=cos(2*pi*50*n)+1.5*cos(2*pi*125*n)+cos(2*pi*135*n)+1.5*randn(size(n));
 4 nfft=1024;
 5 ncxk=3*nfft/4;
 6 cxn=xcorr(x,'unbiased');
 7 CXk=fft(cxn,ncxk);
 8 Pxx=abs(CXk);
 9 index=0:round(ncxk/2-1);
10 k=index*Fs/ncxk;
11 C=Pxx(index+1);
12 P=(Pxx(index+1));
13 plot(k,P);grid on
14 var(C)
15 title('BT法功率谱估计 N=1024');
16 xlabel('频率 Hz');
17 ylabel('功率');

 

转载于:https://www.cnblogs.com/jacklu/p/5140913.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极验验证码流程-3.图片加密处理 图片移位

终于把图片加密给搞定了,原理是他把图分成了52个部分,然后通过移动来形成新的图片 主要的位置关系看代码 顺便吐槽下ruby,小众语言就是这么不方便,很多库都没有,百度了半天 最后换成了java来写 图片保存到本地的就不详细说了 主要…

html-iframe_HTML iframe

html-iframeiframe (Iframes) In HTML, iframes are used to display a webpage inside another webpage. 在HTML中&#xff0c; iframe用于在另一个网页内显示一个网页。 Syntax: 句法&#xff1a; <iframe src"URL"></iframe>The <iframe> tag…

集合操作(三)Set

2019独角兽企业重金招聘Python工程师标准>>> Set集合 HashSet 哈希表保证元素的唯一性依赖于两个方法一个是hashCode方法一个是equals方法 如果两个对象的hashCode值相同,并且调用该对象的equals方法返回的是true的时候,那么就说明两个对象是相同的 结论&#xff1a…

第6周 搜索与排序

1 查找里程 给你这样一张里程表&#xff0c;如何写一个程序&#xff0c;输入两地的地名&#xff0c;能输出期间的里程&#xff1f; #include <stdio.h> #include <string.h> #define C_LEN 30typedef struct city {char name1[C_LEN];char name2[C_LEN];int distan…

(转) Twisted :第十九部分 改变之前的想法

2019独角兽企业重金招聘Python工程师标准>>> 简介 Twisted是一个正在进展的项目,它的开发者会定期添加新的特性并且扩展旧的特性. 随着Twisted 10.1.0发布,开发者向 Deferred 类添加了一个新的特性—— cancellation ——这正是我们今天要研究的. 异步编程将请求和响…

Mac 获取 Brew

2019独角兽企业重金招聘Python工程师标准>>> 终端输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 转载于:https://my.oschina.net/fdstudio/blog/610680

express 项目生成器_用于项目的Express模板生成器(2)| 应用程序结构研究

express 项目生成器Hello! In express template generator for your projects (1), we looked at express generator and how we can start an express application with stressing to build a brand new structure of all required files. 你好&#xff01; 在针对您的项目的E…

Linux 服务器中文乱码编码解决

Linux环境的ECS中&#xff0c;若出现如下中文显示为乱码的情况。 一般原因如下: 1. 未安装中文语言包 2. 未设置正确的默认语言 3. SSH 终端未正确配置 本文以Centos 6.5为例&#xff0c;演示如何解决中文乱码问题。 1. 使用 locale -a |grep zh_CN查看系统是否已经安装…

ldo regula_使用C中的Regula Falsi方法找到复多项式方程的根

ldo regulaRegula Falsi方法 (Regula Falsi method) About the method: 关于方法&#xff1a; We often hear many children and even many adults complaining about the difficulty level that they face while solving complex polynomial equations. It is also difficult…

go newscanner判断文件读取结束_Go单元测试-testing

在开发程序中&#xff0c;很重要一点就是测试&#xff0c;测试可以保证代码的质量&#xff0c;保证每个函数可以正常运行。但是如何保证写出来的程序是否正确。单元测试一般是用来测试我们的代码逻辑有没有问题&#xff0c;有没有按照我们期望的运行&#xff0c;以保证代码质量…

nextdate函数白盒测试问题 软件测试_软件测试基本常识

一、软件测试的分类&#xff1a;1.按照是否执行被测试软件来分&#xff1a;静态测试&#xff1a;是指不运行软件&#xff0c;测试包括代码检查、静态结构分析、代码质量度量等&#xff0c;主要对软件需求说明书、设计说明书、软件源代码进行检查与分析。 动态测试&#xff1a;…

ideatomcat老是运行以前的项目_日“吞”150吨垃圾,禅城集中式餐厨垃圾处理项目启用...

12月9日&#xff0c;禅城区集中式餐厨垃圾处理项目正式投料试运行&#xff0c;该项目如今每天可处理150吨垃圾。这意味着禅城区将通过先进技术实现餐厨垃圾资源化、减量化、无害化处理。禅城区集中式餐厨垃圾处理项目位于佛山市南庄污水处理厂首期工程北侧&#xff0c;禅港路西…

java怎么知道上传文件是否成功_文件包含漏洞之——tomcat CVE-2020-1938漏洞复现

这个漏洞是今年2月份出现的&#xff0c;他的影响范围也是非常广的。2月20日&#xff0c;国家信息安全漏洞共享平台&#xff08;CNVD&#xff09;发布了Apache Tomcat文件包含漏洞&#xff08;CNVD-2020-10487/CVE-2020-1938&#xff09;&#xff0c;这个漏洞是由于Tomcat AJP协…

css word-wrap_CSS中分词“ break-all”和“ break-word”的值之间的差异

css word-wrapDefinition: 定义&#xff1a; What is the most fundamental element that comes to mind when you are considering to develop a web page? Words! If that was your answer, then pat yourself because you are already aware of what we are going to disc…

Android Studio apk 打包流程

1.Build -> Generate Signed APK...&#xff0c;打开如下窗口 2.假设这里没有打过apk包&#xff0c;点击Create new&#xff0c;窗口如下 这里只要输入几个必要项 Key store path&#xff08;生产key文件的保存路径 &#xff09; Key store password&#xff08;key 存储密码…

【Android】11.3 屏幕旋转和场景变换过程中GridView的呈现

分类&#xff1a;C#、Android、VS2015&#xff1b; 创建日期&#xff1a;2016-02-21 一、简介 实际上&#xff0c;对于布局文件中的View来说&#xff0c;大多数情况下&#xff0c;Android都会自动保存这些状态&#xff0c;并不需要我们都去处理它。这一节仍以GridView为例&…

html---textarea初始化时就有个table空格以及tab键操作无效

1 初始化时就有一个tab空格这是由于<textarea></textarea>之间的内容不为空的原因&#xff0c;包含空格和换行&#xff0c;否则浏览器会觉得空格或者换行都是文本域的内容。因此书写时需将<textarea></textarea>紧靠在一起。2 tab键对textarea操作无效…

android decorView详解

摘要 一、DecorView为整个Window界面的最顶层View。 二、DecorView只有一个子元素为LinearLayout。代表整个Window界面&#xff0c;包含通知栏&#xff0c;标题栏&#xff0c;内容显示栏三块区域。 三、LinearLayout里有两个FrameLayout子元素。 (20)为标题栏显示界面。只有一个…

3dmax批量导入obj_ArcGIS 与 3DMax 结合建模

整体技术思路是将项目区二维的CAD测绘底图&#xff0c;通过整理导入到3DMax中&#xff0c;根据CAD底图为基础&#xff0c;绘制三维数字模型。利用Photoshop 平面图像处理软件&#xff0c;对现场采集的照片进行修整&#xff0c;为三维模型制作表面贴图。最终把贴好材质的三维楼体…

字符串乘一个数_【思维拓展】三位数乘两位数,构造最大积和最小积

前面袁老师给大家讲了一个重要结论&#xff0c;并运用这个结论来解决问题&#xff0c;构造两位数乘两位数最大积和最小积的问题。今天&#xff0c;更进一步&#xff0c;三位数乘两位数中&#xff0c;如何构造最大积和最小的积&#xff1f;【问题引入】用9、8、6、5、4这五个数字…