3 `aX@sDdZddljZddlZddljjZddlZddlZej j ej j e ddl mZmZddlmZddlZddlTddlmZmZmZddlmZGd d d ejZGd d d ejZGd ddejZGdddejZGdddejZ GdddejZ!ddZ"ddZ#d#ddZ$ddZ%ddZ&d d!Z'e(d"kr@e'dS)$z yxhu@ASLP-NPU in Sogou inc. N)ConvSTFT ConviSTFT) show_params)*)realimagistft cut_padding)UNetcs&eZdZdfdd ZddZZS) FTB cstt|j||_tjtj||ddgdtj|tj|_ tjtj |||dddtj |tj|_ tj ||dd|_tjtj|d|ddgdtj|tj|_dS) Nr) kernel_sizer )rpaddingF)bias)superr __init__ in_channelnn SequentialConv2d BatchNorm2dReLUconv1Conv1d BatchNorm1dconv1dLinearfreq_fcconv2)self input_dimr r_channel) __class__/mnt/nas_sg/mit_sg/shengkui.zhao/ComplexNN/ComplexNN_16k_V5_UniDFSMN_W40S20_multiUnetx2_residual_mask_Ch_FSMN_full_DNS_Challenge_reverb_20211123/DCUNet/phasen_dccrn.pyrs  z FTB.__init__c Cs|j|}|j\}}}}tj|||||g}|j|}tj|||jd|g}||} tj| dd} |j| } tj| dd} tj| |gd} |j | } | S)z9 inputs should be [Batch, Ca, Dim, Time] rr) rsizetorchreshaperr transposer!catr") r#inputs conv1_outBCDT reshape1_out conv1d_outatt_out freqfc_outcat_outoutputsr'r'r(forward2s    z FTB.forward)r r r)__name__ __module__ __qualname__rr; __classcell__r'r')r&r(r sr cs$eZdZfddZddZZS) InforComucs$tt|jtj||dd|_dS)Nr)r)rr)rr@rrr comu_conv)r# src_channel tgt_channel)r&r'r(rLszInforComu.__init__cCs|tj|j|}|S)N)r+tanhrA)r#srctgtr:r'r'r(r;QszInforComu.forward)r<r=r>rr;r?r'r')r&r(r@Js r@cs&eZdZdfdd ZddZZS) GLayerNorm2d-q=csLtt|j||_tjtjd|ddg|_tjtj d|ddg|_ dS)Nr) rrGrepsr Parameterr+onesbetazerosgamma)r#rrI)r&r'r(rYszGLayerNorm2d.__init__cCsx|j|jdd}tj|ddd}tj|d}tj|d}tj|dddgdd}||tj||j|j|j }|S)NrrT)keepdimrr)) viewr*r+var unsqueezemeansqrtrIrLrN)r#r/ inputs_newrRrTr:r'r'r(r;_s  $zGLayerNorm2d.forward)rH)r<r=r>rr;r?r'r')r&r(rGWsrGcs&eZdZdfdd ZddZZS) TSBr cstt|jt||d|_tjtj||d d dtj|tj |_ tjtj||d d dtj|tj |_ tjtj||d ddtj|tj |_ t||d|_ tjtj||dddt||_tjtj||dddt||_t|||_t|||_dS)N)r$rrr)rrrr )rr)rr)rrZ)rr[)rr)rr)rr)rr)rrZ)rr[)rrWrr ftb1rrrrr amp_conv1 amp_conv2 amp_conv3ftb2rG phase_conv1 phase_conv2r@p2a_comua2p_comu)r#r$ channel_amp channel_phase)r&r'r(rms2        z TSB.__init__c Csf|j|}|j|}|j|}|j|}|j|}|j|}|j|} |j| |} |j|| } | | fS)zl amp should be [Batch, Ca, Dim, Time] amp should be [Batch, Cr, Dim, Time] ) r\r]r^r_r`rarbrcrd) r#ampphaseamp_out1amp_out2amp_out3amp_out4amp_out5 phase_out1 phase_out2amp_out phase_outr'r'r(r;s         z TSB.forward)rXr rY)r<r=r>rr;r?r'r')r&r(rWks&rWcsLeZdZdfdd ZddZd d Zdd d ZdddZdddZZ S)DCCRNdhanningc stj|dd|_||_||_||_| |_d} t|j|j|j|jd| d|_t |j|j|j|jd| d|_ t d||||d|_ t d||||d|_ dS)a> :param complex: Whether to use complex networks. :param model_complexity: :param model_depth: Only two options are available : 10, 20 :param log_amp: Whether to use log amplitude to estimate signals :param padding_mode: Encoder's convolution filter. 'zeros', 'reflect' rrTcomplex) feature_typefix)rwmodel_complexity model_depth padding_modeN)rrfeat_dimwin_lenwin_incfft_lenwin_typerstftrrr unetunet2) r#rwrzr{log_ampr|r~rrrry)r&r'r(rs zDCCRN.__init__c Csg}|j|}tj|d}tj|ddddd|jddf|dddd|jdddfgd}tj|d}tj|dd}|j|}tj|}|j|}tj|}|j ||\}} } |j ||j | |j | ||}|j ||\}} } |j ||j | |j | |S)Nrr) rr+rSr.r}r-rrDr apply_maskappend) r#r/out_listcmp_specZ unet1_outZ cmp_mask1Z unet2_outZ cmp_mask2est_specest_wavest_maskr'r'r(r;s.   "           z DCCRN.forwardc Cstj|dddddddddf|dddddddddf|dddddddddf|dddddddddf|dddddddddf|dddddddddf|dddddddddf|dddddddddfgd}tj|dddddddf|dddddddfgd}tj|d}tj|dddddddf|dddddddfgd}|j|}tj|d}|||fS)Nrr)r+r.squeezer)r#rcmp_maskrrr'r'r(rs@ @  zDCCRN.apply_maskcCsVgg}}x2|jD]&\}}d|kr0||g7}q||g7}qW||d|ddg}|S)Nr)params weight_decayg)named_parameters)r#rweightsbiasesnameparamrr'r'r( get_paramss   zDCCRN.get_paramsMixcCsl|dkrd}xz|t|kr||}|d}||}|d}||}|d}|dkrl|j||||||} | } q|j||||||} | } qWtt|d} | }|S|dkrhd}x|t|krH||}|d}||}|d}||}|d}|dkr |j||||||\}}}|||} q|j||||||\}}}|||} qWtt|d} | }|||fSdS)NSiSNRrrr)r)len loss_1layerint)r#noisylabelsrmodecountrrrZ SiSNR_loss1Zloss1Z SiSNR_loss2Zloss2 num_layerslossamp_loss phase_loss SiSNR_lossr'r'r(rsD  z DCCRN.losscCs |dkrD|jdkr tj|d}|jdkr8tj|d}t|| S|dkr|jdkrftj|d}|jdkr~tj|d}t|| }|j\}} } |j|} | ddd|jddf} | dd|jdddf} |j|}|ddd|jddf}|dd|jdddf}|d|d}tj|}tj| || ||d| || ||dgd}d||dk<d||d k<t j |ddd|jddf|ddd|jddf| }t j |dd|jdddf|dd|jdddf| }|||}|||fSdS) z mode == 'Mix' est: [B, F*2, T] labels: [B, F*2,T] mode == 'SiSNR' est: [B, T] labels: [B, T] rr)rrNrg:0yE>rP) dimr+rsi_snrr*rr}rUr.Fmse_loss)r#restrrrrrbdtSSrZSiYYrYiZY_powZY_magZgth_maskrrall_lossr'r'r(r)s8               8  @@ zDCCRN.loss_1layer)rsrtrurv)r)r)r) r<r=r>rr;rrrrr?r'r')r&r(rrs %  'rrcs:eZdZdfd d Zdd d ZddZdddZZS)PHASENrtrvr)r[,c stt|jd|_|dd|_||_||_||_||_d} t |j|j|j|jd| d|_ t |j|j|j|jd| d|_ t jt jd|ddgdd t j|t jt j||ddgdd t j|t j|_t jt jd|dd gdd t j||dd gdd |_t j|_x,t|jD]} |jjt|j||d qWt jt j|dddgdt jdt j|_t jt j|dddgd|_t j|jd|dd|_t jt j|ddt jt jddt jt jddt j|_ t!|dS)Nr)rrTrw)rxryr)rrrrZr[)r$rerfrY)r) bidirectionaliXi)r)r)rr))rr)rr[i)"rrr num_blocksr}r~rrrrrrrrrrrrr]ra ModuleListtsbsrangerrWr^rrbGRUrnnr Sigmoidfcsr) r#r~rrrrrerfrnn_numsryidx)r&r'r(r_sh         zPHASEN.__init__cCsVgg}}x2|jD]&\}}d|kr0||g7}q||g7}qW||d|ddg}|S)Nr)rrg)r)r#rrrrrrr'r'r(rs   zPHASEN.get_paramscCsT|j|}tj|d}tj|ddddd|jddf|dddd|jdddfgd}tjtj|dddfdtj|dddfd}tj|d}|j|}|j|}|}|}xz/amp_spec: {}, spec: {}, phase: {}, est_spec: {}z est_spec: {})rr+rSr.r}rUabsr]ra enumeraterr^r-r*r,rrrbprintformatrr)r#r/ramp_specspecrhs_specs_phaserlayerr1r4r3r2rrr'r'r(r;sN   "       $(  zPHASEN.forwardrcCsb|dkrD|jdkr tj|d}|jdkr8tj|d}t|| S|dkr^|j\}}}|j|}|}tj|ddd|jddfd|dd|jdddfd} tj|ddd|jddfd|dd|jdddfd} | d} | d} tj | | |} | d| j ddd}tj |||||}| d |d }|| |fSdS) z mode == 'Mix' est: [B, F*2, T] labels: [B, F*2,T] mode == 'SiSNR' est: [B, T] labels: [B, T] rr)rrNrg333333?g:0yE>g?) rr+rrr*rrUr}rrrepeat)r#rrrrrr gth_cspec est_cspec gth_mag_spec est_mag_specgth_cprs_mag_specest_cprs_mag_specr compress_coffrrr'r'r(rs8        $$z PHASEN.loss)rrtrrvr)rr[r)r)r)r<r=r>rrr;rr?r'r')r&r(r]sH ?rcCstj|ddd}||}|S)NrT)rOrP)r+rT)datarTr'r'r( remove_dc,srcCstj||ddd}|S)NrT)rOrP)r+sum)s1s2normr'r'r(l2_norm0sr:0yE>c Csdt||}t||}||||}||}t||}t||}dtj||||} tj| S)N )rr+log10rT) rrrI s1_s2_norm s2_s2_norms_targete_nosie target_norm noise_normsnrr'r'r(r7s    rcCs4tjdtjddddg}t}t||jdS)Nrr irt)r+ manual_seedrandnr rshape)r/netr'r'r(test_ftbEs rcCsTtjdtjddddg}tjddddg}t}|||\}}t|j|jdS)Nrrr irtrY)r+rrrWrr)r/rhrout1out2r'r'r(test_tsbKs  rcCsztjdtjddd g}tjdd g}t}||\}}t|j|j|j||dd}|j||dd}td |d |dS) Nrrri>rr)rrzmix:zSNR:ii)r+rrrrrr)r/ wav_labelrrrsisnrrr'r'r( test_PHASENSs  r__main__)r))__doc__torch.nnrr+Ztorch.nn.functional functionalrossyspathrdirname__file__ conv_stftrrshowrnumpynpconstantutilsrrr rr Moduler r@rGrWrrrrrrrrrr<r'r'r'r(s8    1 =6P