语音增强-------------维纳滤波

原理介绍

时域维纳滤波

若输入信号y(n)y\left( n \right)y(n)和期望信号d(n)d\left( n \right)d(n)是联合广义平稳随机过程,那么系统输出对应的误差可以表示为
e(n)=d(n)−d^(n)=d(n)−hTy\begin{aligned} & e\left( n \right)=d\left( n \right)-\hat{d}\left( n \right) \\ & =d\left( n \right)-{{\mathbf{h}}^{T}}\mathbf{y} \end{aligned}​e(n)=d(n)−d^(n)=d(n)−hTy​
其中h=[h0h1⋯hM−1]T\mathbf{h}={{\left[ \begin{matrix} {{h}_{0}} & {{h}_{1}} & \cdots & {{h}_{M-1}} \\ \end{matrix} \right]}^{T}}h=[h0​​h1​​⋯​hM−1​​]T为滤波器的系数,
y=[y(n)y(n−1)⋯y(n−M+1)]T\mathbf{y}={{\left[ \begin{matrix} y\left( n \right) & y\left( n-1 \right) & \cdots & y\left( n-M+1 \right) \\ \end{matrix} \right]}^{T}}y=[y(n)​y(n−1)​⋯​y(n−M+1)​]T为输入的向量。
为了找到最优的滤波器系数,以最小均方误差的准则进行求解
J=E[e2(n)]=E[(d(n)−hTy)2]=E[d2(n)]−2hTE[yd(n)]+hTE[yyT]h=E[d2(n)]−2hTryd+hTRyyh\begin{aligned} & J=E\left[ {{e}^{2}}\left( n \right) \right]=E\left[ {{\left( d\left( n \right)-{{\mathbf{h}}^{T}}\mathbf{y} \right)}^{2}} \right] \\ & =E\left[ {{d}^{2}}\left( n \right) \right]-2{{\mathbf{h}}^{T}}E\left[ \mathbf{y}d\left( n \right) \right]+{{\mathbf{h}}^{T}}E\left[ \mathbf{y}{{\mathbf{y}}^{T}} \right]\mathbf{h} \\ & =E\left[ {{d}^{2}}\left( n \right) \right]-2{{\mathbf{h}}^{T}}{{\mathbf{r}}_{yd}}+{{\mathbf{h}}^{T}}{{\mathbf{R}}_{yy}}\mathbf{h} \end{aligned} ​J=E[e2(n)]=E[(d(n)−hTy)2]=E[d2(n)]−2hTE[yd(n)]+hTE[yyT]h=E[d2(n)]−2hTryd​+hTRyy​h​
ryd{{\mathbf{r}}_{yd}}ryd​为输入信号与期望信号的互相关,Ryy{{\mathbf{R}}_{yy}}Ryy​为输入信号的自相关矩阵,为了使代价函数JJJ最小,对其进行求导可以得到
∂J∂hk=2E[e(n)∂e(n)∂hk]=0,k=0,1,⋯,M−1\frac{\partial J}{\partial {{h}_{k}}}=2E\left[ e\left( n \right)\frac{\partial e\left( n \right)}{\partial {{h}_{k}}} \right]=0,\ \ \ \ k=0,1,\cdots ,M-1∂hk​∂J​=2E[e(n)∂hk​∂e(n)​]=0,    k=0,1,⋯,M−1
由于∂e(n)∂hk=−y(n−k)\frac{\partial e\left( n \right)}{\partial {{h}_{k}}}\text{=}-y\left( n-k \right)∂hk​∂e(n)​=−y(n−k),上式可以化简为
∂J∂hk=−2E[e(n)y(n−k)]=0,k=0,1,⋯,M−1\frac{\partial J}{\partial {{h}_{k}}}=-2E\left[ e\left( n \right)y\left( n-k \right) \right]=0,\ \ \ \ k=0,1,\cdots ,M-1∂hk​∂J​=−2E[e(n)y(n−k)]=0,    k=0,1,⋯,M−1
利用矩阵求导可以得到
∂J∂h=−2ryd+2hTRyy=0\frac{\partial J}{\partial \mathbf{h}}\text{=}-2{{\mathbf{r}}_{yd}}+2{{\mathbf{h}}^{T}}{{\mathbf{R}}_{yy}}=0∂h∂J​=−2ryd​+2hTRyy​=0
那么滤波器的最优系数为
hopt=Ryy−1ryd{{\mathbf{h}}_{\text{opt}}}=\mathbf{R}_{yy}^{-1}{{\mathbf{r}}_{yd}}hopt​=Ryy−1​ryd​
上式称为Wiener-Hopf方程的解。

频域维纳滤波器

如果考虑系统的输出为
d^(n)=h(n)∗y(n)=∑k=−∞+∞hky(n−k),−∞<n<+∞\hat{d}\left( n \right)=h\left( n \right)*y\left( n \right)=\sum\limits_{k=-\infty }^{+\infty }{{{h}_{k}}y\left( n-k \right)},\ \ \ \ -\infty <n<+\infty d^(n)=h(n)∗y(n)=k=−∞∑+∞​hk​y(n−k),    −∞<n<+∞
那么相应的Wiener-Hopf方程为
∑k=−∞+∞hkryy(m−k)=ryd(−m),−∞<m<+∞\sum\limits_{k=-\infty }^{+\infty }{{{h}_{k}}{{r}_{yy}}\left( m-k \right)={{r}_{yd}}\left( -m \right)},\ \ \ \ -\infty <m<+\infty k=−∞∑+∞​hk​ryy​(m−k)=ryd​(−m),    −∞<m<+∞
在频域上面,系统的输出可以写为
D^(ω)=H(ω)Y(ω)\hat{D}\left( \omega \right)=H\left( \omega \right)Y\left( \omega \right)D^(ω)=H(ω)Y(ω)
定义估计误差
E(ω)=D(ω)−D^(ω)=D(ω)−H(ω)Y(ω)\begin{aligned} & E\left( \omega \right)=D\left( \omega \right)-\hat{D}\left( \omega \right) \\ & =D\left( \omega \right)-H\left( \omega \right)Y\left( \omega \right) \end{aligned} ​E(ω)=D(ω)−D^(ω)=D(ω)−H(ω)Y(ω)​
那么均方误差可以写作
J=E{[D(ω)−H(ω)Y(ω)]∗[D(ω)−H(ω)Y(ω)]}=E[∣D(ω)∣2]−H(ω)E[D∗(ω)Y(ω)]−H∗(ω)E[Y∗(ω)D(ω)]+∣H(ω)∣2E[∣Y(ω)∣2]=E[∣D(ω)∣2]−H(ω)Pyd(ω)−H∗(ω)Pdy(ω)+∣H(ω)∣2Pyy(ω)\begin{aligned} & J=E\left\{ {{\left[ D\left( \omega \right)-H\left( \omega \right)Y\left( \omega \right) \right]}^{*}}\left[ D\left( \omega \right)-H\left( \omega \right)Y\left( \omega \right) \right] \right\} \\ & =E\left[ {{\left| D\left( \omega \right) \right|}^{2}} \right]-H\left( \omega \right)E\left[ {{D}^{*}}\left( \omega \right)Y\left( \omega \right) \right]-{{H}^{*}}\left( \omega \right)E\left[ {{Y}^{*}}\left( \omega \right)D\left( \omega \right) \right] \\ & +{{\left| H\left( \omega \right) \right|}^{2}}E\left[ {{\left| Y\left( \omega \right) \right|}^{2}} \right] \\ & \text{=}E\left[ {{\left| D\left( \omega \right) \right|}^{2}} \right]-H\left( \omega \right){{P}_{yd}}\left( \omega \right)-{{H}^{*}}\left( \omega \right){{P}_{dy}}\left( \omega \right)+{{\left| H\left( \omega \right) \right|}^{2}}{{P}_{yy}}\left( \omega \right) \end{aligned} ​J=E{[D(ω)−H(ω)Y(ω)]∗[D(ω)−H(ω)Y(ω)]}=E[∣D(ω)∣2]−H(ω)E[D∗(ω)Y(ω)]−H∗(ω)E[Y∗(ω)D(ω)]+∣H(ω)∣2E[∣Y(ω)∣2]=E[∣D(ω)∣2]−H(ω)Pyd​(ω)−H∗(ω)Pdy​(ω)+∣H(ω)∣2Pyy​(ω)​
其中,Pyd(ω){{P}_{yd}}\left( \omega \right)Pyd​(ω)为 y(n)y\left( n \right)y(n)与d(n)d\left( n \right)d(n)的互功率谱,Pyy(ω){{P}_{yy}}\left( \omega \right)Pyy​(ω)为y(n)y\left( n \right)y(n)的功率谱。对误差进行求导,可得
∂J∂H(ω)=H∗(ω)Pyy(ω)−Pyd(ω)=[H(ω)Pyy(ω)−Pdy(ω)]∗=0\begin{aligned} & \frac{\partial J}{\partial H\left( \omega \right)}={{H}^{*}}\left( \omega \right){{P}_{yy}}\left( \omega \right)-{{P}_{yd}}\left( \omega \right) \\ & ={{\left[ H\left( \omega \right){{P}_{yy}}\left( \omega \right)-{{P}_{dy}}\left( \omega \right) \right]}^{*}} \\ & =0 \end{aligned}​∂H(ω)∂J​=H∗(ω)Pyy​(ω)−Pyd​(ω)=[H(ω)Pyy​(ω)−Pdy​(ω)]∗=0​
而Pyd(ω)=Pdy∗(ω){{P}_{yd}}\left( \omega \right)=P_{dy}^{*}\left( \omega \right)Pyd​(ω)=Pdy∗​(ω),因此频域维纳滤波器的解为
H(ω)=Pdy(ω)Pyy(ω)H\left( \omega \right)=\frac{{{P}_{dy}}\left( \omega \right)}{{{P}_{yy}}\left( \omega \right)}H(ω)=Pyy​(ω)Pdy​(ω)​
从上面的推导过程可以看出,频域维纳滤波器的解是时域维纳滤波器的解经过傅里叶变换得到的。
对于语音信号来讲,其接收的模型为
x(n)=s(n)+d(n)x\left( n \right)=s\left( n \right)+d\left( n \right)x(n)=s(n)+d(n)
那么维纳滤波器就是要产生对s(n)s\left( n \right)s(n)的一个估计
假设信号与噪声互不相关且具有零均值,那么可以得到时域维纳滤波器为
h∗=(Rss+Rdd)−1rss{{\mathbf{h}}^{*}}={{\left( {{\mathbf{R}}_{ss}}+{{\mathbf{R}}_{dd}} \right)}^{-1}}{{\mathbf{r}}_{ss}}h∗=(Rss​+Rdd​)−1rss​
可以将其重新写为
h∗=(ISNR+R^dd−1R^ss)−1R^dd−1R^ssu{{\mathbf{h}}^{*}}={{\left( \frac{\mathbf{I}}{SNR}+\mathbf{\hat{R}}_{dd}^{-1}{{{\mathbf{\hat{R}}}}_{ss}} \right)}^{-1}}\mathbf{\hat{R}}_{dd}^{-1}{{\mathbf{\hat{R}}}_{ss}}\mathbf{u}h∗=(SNRI​+R^dd−1​R^ss​)−1R^dd−1​R^ss​u
其中,SNR=E{s2(n)}E{d2(n)}=σs2σd2SNR=\frac{E\left\{ {{s}^{2}}\left( n \right) \right\}}{E\left\{ {{d}^{2}}\left( n \right) \right\}}=\frac{\sigma _{s}^{2}}{\sigma _{d}^{2}}SNR=E{d2(n)}E{s2(n)}​=σd2​σs2​​为信噪比,I\mathbf{I}I为单位矩阵,u=[10⋯0]T\mathbf{u}={{\left[ \begin{matrix} 1 & 0 & \cdots & 0 \\ \end{matrix} \right]}^{T}}u=[1​0​⋯​0​]T, R^ss=Rss/σs2{{\mathbf{\hat{R}}}_{ss}}\text{=}{{\mathbf{R}}_{ss}}/\sigma _{s}^{2}R^ss​=Rss​/σs2​ ,R^dd=Rdd/σd2{{\mathbf{\hat{R}}}_{dd}}\text{=}{{\mathbf{R}}_{dd}}/\sigma _{d}^{2}R^dd​=Rdd​/σd2​ ,那么可以得到以下关系式
lim⁡SNR→+∞h∗=u\underset{SNR\to +\infty }{\mathop{\lim }}\,{{\mathbf{h}}^{*}}=\mathbf{u}SNR→+∞lim​h∗=u
lim⁡SNR→+0h∗=0\underset{SNR\to +0}{\mathop{\lim }}\,{{\mathbf{h}}^{*}}=\mathbf{0}SNR→+0lim​h∗=0
当SNR→+∞SNR\to +\inftySNR→+∞时,由于uTx=x(n){{\mathbf{u}}^{T}}\mathbf{x}=x\left( n \right)uTx=x(n),此时维纳滤波器并不会滤除噪声,也就是说此时的维纳滤波器不会产生语音失真;当SNR→0SNR\to 0SNR→0,维纳滤波器的输出将会被严重衰减,此时的维纳滤波器会对语音信号造成失真。
与时域维纳滤波器对应的频域维纳滤波器为
H(ω)=Pss(ω)Pss(ω)+Pdd(ω)H\left( \omega \right)=\frac{{{P}_{ss}}\left( \omega \right)}{{{P}_{ss}}\left( \omega \right)+{{P}_{dd}}\left( \omega \right)}H(ω)=Pss​(ω)+Pdd​(ω)Pss​(ω)​
显然,这种滤波器是非因果的。
定义ξ=Pss(ω)Pdd(ω)\xi \text{=}\frac{{{P}_{ss}}\left( \omega \right)}{{{P}_{dd}}\left( \omega \right)}ξ=Pdd​(ω)Pss​(ω)​作为在频率ω\omegaω 处的先验信噪比,那么频域的维纳滤波器可以表示为
H=ξξ+1H\text{=}\frac{\xi }{\xi \text{+}1}H=ξ+1ξ​

当 ξ→∞\xi \to \inftyξ→∞信噪比极大,H≈1H\approx 1H≈1,此时维纳滤波器并不会滤除噪声,也就是说此时的维纳滤波器不会产生语音失真;当 ξ→0\xi \to 0ξ→0(信噪比极小),H≈0H\approx 0H≈0,维纳滤波器的输出将会被严重衰减,此时的维纳滤波器会对语音信号造成失真,与之前的时域维纳滤波器相对应。
为了更好地理解维纳滤波器,下面对其进行简单仿真,仿真参数如下

参数名称 参数值
信噪比 5dB
采样率 16KHz


这张图给出的是维纳滤波前后语音信号以及语谱图的对照。从图中可以看出,经过维纳滤波后,被噪声污染的语音信号有了一定的改善,但是从图中也可以看出,维纳滤波后依然存在一些噪声,这也与维纳滤波器的滤波特性相关。
代码如下:

clear;
close all;
clc;
%% 读入数据
[signal,~]=audioread('clean.wav');      %读入干净语音
[noise,fs]=audioread('noise.wav');       %读入噪声
N=3*fs;                                              %选取3秒的语音
signal=signal(1:N);
noise=noise(1:N);
N=length(signal);
t=(0:N-1)/fs;
SNR=5;                 %信噪比大小
noise=noise/norm(noise,2).*10^(-SNR/20)*norm(signal);
x=signal+noise;          %产生固定信噪比的带噪语音
audiowrite('mixed.wav',x,fs);          %将混合的语音写入
enhanced_speech=wiener_as('mixed.wav','enhanced_speech.wav');
figure(1)
subplot(321);
plot(t,signal);ylim([-1.5,1.5]);title('干净语音');xlabel('时间/s');ylabel('幅度');
subplot(323);
plot(t,x);ylim([-1.5,1.5]);title('带噪语音');xlabel('时间/s');ylabel('幅度');
subplot(325);
plot(t,real(enhanced_speech));ylim([-1.5,1.5]);title('维纳滤波增强后的语音');xlabel('时间/s');ylabel('幅度');
subplot(322);
spectrogram(signal,256,128,256,16000,'yaxis');
subplot(324);
spectrogram(x,256,128,256,16000,'yaxis');
subplot(326);
spectrogram(enhanced_speech,256,128,256,16000,'yaxis');

wiener_as.m如下

function [enhanced_speech, fs, nbits] = wiener_as(filename,outfile)%
%  Implements the Wiener filtering algorithm based on a priori SNR estimation [1].
%
%  Usage:  wiener_as(noisyFile, outputFile)
%
%         infile - noisy speech file in .wav format
%         outputFile - enhanced output file in .wav format%
%  Example call:  wiener_as('sp04_babble_sn10.wav','out_wien_as.wav');
%
%  References:
%   [1] Scalart, P. and Filho, J. (1996). Speech enhancement based on a priori
%       signal to noise estimation. Proc. IEEE Int. Conf. Acoust. , Speech, Signal
%       Processing, 629-632.
%
% Authors: Yi Hu and Philipos C. Loizou
%
% Copyright (c) 2006 by Philipos C. Loizou
% $Revision: 0.0 $  $Date: 10/09/2006 $
%-------------------------------------------------------------------------if nargin<2fprintf('Usage: wiener_as(noisyfile.wav,outFile.wav) \n\n');return;
end[noisy_speech, fs]= audioread(filename);
aInfo = audioinfo(filename);
nbits = aInfo.BitsPerSample; % 16 bits resolution
% column vector noisy_speech% set parameter values
mu= 0.98; % smoothing factor in noise spectrum update
a_dd= 0.98; % smoothing factor in priori update
eta= 0.15; % VAD threshold
frame_dur= 20; % frame duration (20ms Hamming Window)
L= frame_dur* fs/ 1000; % L is frame length (160 for 8k sampling rate)
hamming_win= hamming( L); % hamming window
U= ( hamming_win'* hamming_win)/ L; % normalization factor% first 120 ms is noise only
len_120ms= fs/ 1000* 120;
% first_120ms= noisy_speech( 1: len_120ms).* ...
%     (hann( len_120ms, 'periodic'))';
first_120ms= noisy_speech( 1: len_120ms);% =============now use Welch's method to estimate power spectrum with
% Hamming window and 50% overlap
nsubframes= floor( len_120ms/ (L/ 2))- 1;  % 50% overlap
noise_ps= zeros( L, 1); %noise power spectral
n_start= 1;
for j= 1: nsubframesnoise= first_120ms( n_start: n_start+ L- 1);noise= noise.* hamming_win;noise_fft= fft( noise, L); %noise FFTnoise_ps= noise_ps+ ( abs( noise_fft).^ 2)/ (L* U);n_start= n_start+ L/ 2;
end
noise_ps= noise_ps/ nsubframes;
%==============% number of noisy speech frames
len1= L/ 2; % with 50% overlap
nframes= floor( length( noisy_speech)/ len1)- 1;
n_start= 1; for j= 1: nframesnoisy= noisy_speech( n_start: n_start+ L- 1);noisy= noisy.* hamming_win;noisy_fft= fft( noisy, L);noisy_ps= ( abs( noisy_fft).^ 2)/ (L* U);% ============ voice activity detectionif (j== 1) % initialize posteriposteri= noisy_ps./ noise_ps; %postriori SNRposteri_prime= posteri- 1; posteri_prime( find( posteri_prime< 0))= 0;priori= a_dd+ (1-a_dd)* posteri_prime; %a priori SNRelseposteri= noisy_ps./ noise_ps; %postriori SNRposteri_prime= posteri- 1;posteri_prime( find( posteri_prime< 0))= 0;priori= a_dd* (G_prev.^ 2).* posteri_prev+ ...(1-a_dd)* posteri_prime; %a priori SNRendlog_sigma_k= posteri.* priori./ (1+ priori)- log(1+ priori);    vad_decision(j)= sum( log_sigma_k)/ L;    if (vad_decision(j)< eta) % noise only frame foundnoise_ps= mu* noise_ps+ (1- mu)* noisy_ps;vad( n_start: n_start+ L- 1)= 0;elsevad( n_start: n_start+ L- 1)= 1;end% ===end of vad===G= sqrt( priori./ (1+ priori)); % gain functionenhanced= ifft( noisy_fft.* G, L);if (j== 1)enhanced_speech( n_start: n_start+ L/2- 1)= ...enhanced( 1: L/2);elseenhanced_speech( n_start: n_start+ L/2- 1)= ...overlap+ enhanced( 1: L/2);  endoverlap= enhanced( L/ 2+ 1: L);n_start= n_start+ L/ 2; G_prev= G; posteri_prev= posteri;endenhanced_speech( n_start: n_start+ L/2- 1)= overlap; audiowrite( outfile, enhanced_speech, fs, 'BitsPerSample', nbits);
end

关于语音及噪声文件,具体请参考:语音信号处理常用语料库下载地址

参考文献
[1]Loizou P C . Speech Enhancement: Theory and Practice[M]. CRC Press, Inc. 2007.
[2]PhiliposC.Loizou. 语音增强:理论与实践:theory and practice[M]// 语音增强:理论与实践:theory and practice. 电子科技大学出版社, 2012.

语音增强--维纳滤波介绍及MATLAB实现相关推荐

  1. 语音增强--卡尔曼滤波介绍及MATLAB实现

    语音增强--------------卡尔曼滤波 状态方程 x k + 1 = Φ k x k + Γ u k {{\mathbf{x}}_{k+1}}={{\mathbf{\Phi }}_{k}}{{ ...

  2. 语音增强--子空间算法及MATLAB实现

    语音增强--------------子空间算法 原理介绍 子空间方法的原理是将观测信号的向量空间分解为信号子空间和噪声子空间,通过消除噪声子空间并保留信号子空间从而估计出干净语音,子空间分解的过程是对 ...

  3. 基于维纳滤波的语音增强算法 matlab,基于维纳滤波语音增强算法的改进实现

    通过对维纳滤波的介绍,实现了基本维纳滤波效果;利用两级维纳滤波和两级滤波器组滤波方法实现了语音增强,达到了良好的效果. 维普资讯 http://doc.docsou.com 文章编号:0 2 8 8 ...

  4. 基于matlab语音增强,基于MATLAB的语音增强系统的设计

    187 2010 年第 05 期,第 43 卷 通 信 技 术 Vol.43,No.05,2010 总第 221 期 Communications Technology No.221,Totally ...

  5. 【信号处理】基于小波变换的语音增强matlab源码

    一.简介 语音通信是人类传播信息,进行交流时使用最多.最自然.最基本的一种手段.而这种通信中的信息载体-语音信号却是一种时变的.非平稳的信号,只有在很短的一段时间内(通常为10~30ms)才被认为是平 ...

  6. 传统语音增强——基于先验信噪比的维纳滤波语音降噪算法

    一.基于先验信噪比的维纳滤波语音降噪算法的基本概念 改进的维纳滤波器为基于先验信噪比的维纳滤波器,其原理框图下图所示. 对于第m帧带噪语音信号ym(n)=sm(n)+nm(n) 式中,sm(n)是第m ...

  7. matlab 的谱相减语音增强算法的研究,基于MATLAB的谱相减语音增强算法的研究

    语音处理 谱减法 语音增加 去噪 维普资讯 http://www.wendangwang.com 第2卷第3 3期 文章编号:06- 3 8 2 0 ) 3-07 0 10 9 4 (0 6 0 2 ...

  8. Matlab神经网络语音增强,基于BP神经网络的语音增强研究

    曰髯? 分类号: 论文编号:2丛坦丝旦生丛 密级:公开 贵州大学 2009届硕士研究生学位论文 基于即神经网络的语音增强研究 学科专业:电路与系统 研究方向:模式识别 导师:刘宇红教授 研究生:周元芬 ...

  9. 【语音增强】基于matlab人耳掩蔽效应语音增强【含Matlab源码 428期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[语音增强]基于matlab人耳掩蔽效应语音增强[含Matlab源码 428期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

最新文章

  1. 混合云存储组合拳:基于云存储网关与混合云备份的OSS数据备份方案
  2. push an existing repository from the command line
  3. BugkuCTF-Misc:宽带信息泄露
  4. 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)
  5. markdown改字体和背景颜色(html)
  6. cocos2d-x之读取xml文件
  7. 以Chef和Ansible为例快速入门服务器配置
  8. 进阶!基于CentOS7系统使用cobbler实现单台服务器批量自动化安装不同版本系统(week3_day5_part2)-技术流ken...
  9. 安装win7和Centos后,默认启动项的修改.
  10. 【速达软件】【速达5000】5系3.97批量删除采购开单从表重复项并合计到主表
  11. 节约里程法求解CVRP问题
  12. django下载xlsx的方法
  13. 安卓ExpandableListView的详细使用教程(附代码解析过程)
  14. 外显子测序数据分析流程
  15. 王珞丹用手写传递情感 字体入库笔尖上的中国
  16. U8glib如何显示中文
  17. ps 图片文字改黑白
  18. python vue+flask 跨域请求
  19. aircrack-ng 介绍、功能测试及部分源码分析
  20. idea自定义archetype及错误处理

热门文章

  1. div浮动到另一个div上面或者浮动到img图片上面
  2. 易观 OLAP 大赛揭晓 PingCAP 斩获商业组桂冠
  3. 【MATLAB】高塔观测数据波文比法计算感热及潜热通量
  4. Mac下的plist纹理图切图工具(命令行)
  5. aliexpress 速卖通主图、SKU、属性、详情Python 测试爬取
  6. Hexagon SDK安装过程指导
  7. vue input输入框事件
  8. mysql表被锁住/表打不开 Waiting for table metadata lock
  9. Pandas 删除列
  10. 第四篇 再读Spring 之BeanDefinition注册