o
    oi"D                     @   sz   d dl Zd dlmZ d dlmZ d dlmZ dddZdd	d
ZdddZ	dd Z
dddZdd ZdddZdd ZdS )    N)pesq)toeplitz)stftc                 C   sz   || }| j d d | j d | | |f }| jd d || jd  | jd f }tjjj| ||d}|d ur;|| }|S )N)shapestrides)r   r   nplibstride_tricks
as_strided)xnpersegnoverlapwindowstepr   r   result r   E/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/sepm.pyextractOverlappedWindows   s   $&r   Q?      ?c              
   C   s   t t jj}t|| }tt d| | | }d}d}	ddt dt j t 	d|d  |d    }
t
| ||| |
}t
|||| |
}t |dd}t || dd}dt |||  |  }||||k < |	|||	k< |d d }t |S )N   #         ?   r   
   )r   finfofloat64epsroundintfloorcospiaranger   powersumlog10mean)clean_speechprocessed_speechfsframeLenoverlapr   	winlengthskiprateMIN_SNRMAX_SNRhannWinclean_speech_framedprocessed_speech_framedsignal_energynoise_energysegmental_snrr   r   r   SNRseg   s&   0
r9   c           &      C   s  | j |j kr
tdttjj}| tj| } |tj| }t|| }tt	d| | | }|d }d}	dt
td|  }
t|
d }d}t|	f}t|	f}d|d< d|d< d	|d< d|d< d
|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d < d!|d < d"|d#< d$|d#< d%|d&< d'|d&< d(|d)< d*|d)< d+|d,< d-|d,< d.|d/< d0|d/< d1|d2< d3|d2< d4|d5< d6|d5< d7|d8< d9|d8< d:|d;< d<|d;< d=|d>< d?|d>< d@|dA< dB|dA< dC|dD< dE|dD< dF|dG< dH|dG< |d }tdI}t|	f}t|	t|f}td|}t|	D ]V}|| | | }t	|||< || | | }t|t||  }tdJ|t	| | d  | ||d d f< ||d d f ||d d f |k ||d d f< qDt| | ||  }dKdtdtj td|d  |d    }t| dt|| t||   ||||| |
dLdMd dLdN
\}}}t|}|d dOd d f }||d }t|dt|| t||   ||||| |
dLdMd dLdN
\}}}t|}|d dOd d f }||d }||}||} t||  d}!||!|!|k < t||}"dt|d |!  }#t|"|# dt|"d }$|$ }%dP|%|%dPk < dQ|%|%dQk< t|%S )RNThe two signals do not match!r   r      g?      I@r        Q@      ^@     g@     @p@        t@         y@        `}@        @   AfWS@"J@   6[U@/$@	   HW@~j@r   MZZ@/$A@   Mb]@ףp=
@   "~_@33333@   K7a@{G"@   uV:c@\(@   rhe@*@   vf@q=
ף@   Fh@Q'@   7A`$k@\(F@   x&1tm@Rk@   \(o@=
ף@   x&Aq@GzD@   tr@p=
W@   =
ףpt@(\B@   V-u@r   FT	r,   r   r   r   nfftdetrendreturn_onesidedboundarypaddedr   r   r   )r   
ValueErrorr   r   r   r   astyper    r!   r"   ceillog2zerosexpr%   rangeloglenr#   r$   r   absr'   dotr&   r(   copyr)   )&cleanSigenhancedSigr,   r-   r.   r   r/   r0   max_freqnum_critn_fftn_fftby2gamma	cent_freq	bandwidthbw_min
min_factorall_f0crit_filterjif0bwnorm_factor
num_framesr3   ftZxx
clean_specenh_specclean_energyprocessed_energyerror_energyW_freqSNRlogfwSNR
distortionr   r   r   fwSNRseg6   s   
040




r   c              
   C   s  t t jj}| jd }g }t|d D ]}| d ||  }| || }|t ||  qt |f}t 	|d f}	t 	|f}
|d |	d< t|D ]`}|dkrVd}n|d | }t |t 
||dd  }||d  | t|	| | |
|< |
| ||< |dkr|d | |
| |d d d   |d |< d|
| |
|   |	|  |	|d < qMt j
|t jd}t j
|
t jd}|d }t j
dgt| t jd}t j
|t jd}t j
|t jd}t j
|t jd}||fS )Nr   r   r   )dtype)r   r   r   r   r   r   appendr'   onesr   arraymaxfloat32list)speech_framemodel_orderr   r/   RkfirstsecondaErcoeffr   sum_terma_pastacorrrefcoefflpparamsr   r   r   lpcoeff   s:   
"*&r   c              
   C   s  t t jj}d}t|| }tt d| | | }|dk r#d}	nd}	ddt dt j t 	d|d  |d    }
t
| ||| |
}t
|||| |
}|jd }|dkrZd S t |d f}t |d f| }t|d D ]8}t||d d f |	\}}t||d d f |	\}}|t||j||< |t||j| ||< qr|| }d	||dk< t |}t |}|d ttt||  }t |S )
Nffffff?r   i'  r   rc   r   r   r   i  )r   r   r   r   r    r!   r"   r#   r$   r%   r   r   r   r   r   r   r   Tr   sortr   r)   )r*   r+   r,   r-   r.   r   alphar/   r0   Pr3   r4   r5   	numFrames
numeratorsdenominatorsiiA_cleanR_cleanA_procR_procfracr   r   r   r   llr   s<   0
 


r   c                 C   s   t |}t| }tt | D ]O}|}| | dkr>||d k r5| | dkr5|d }||d k r5| | dks%||d  ||< q|dkrV| | dkrV|d }|dkrV| | dksH||d  ||< q|S )Nr   r   )r   r   
zeros_liker   )slopeenergyr   	loc_peaksr   nr   r   r   findLocPeaks  s   
r   c           6      C   sx  d}d}d}| j |j krtdttjj}| tj| } |tj| }t|| }	tt	d| | | }
|d }d}dt
td|	  }t|d }t|f}t|f}d|d< d	|d< d
|d< d	|d< d|d< d	|d< d|d< d	|d< d|d< d	|d< d|d< d	|d< d|d< d	|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d |d!< d"|d!< d#|d$< d%|d$< d&|d'< d(|d'< d)|d*< d+|d*< d,|d-< d.|d-< d/|d0< d1|d0< d2|d3< d4|d3< d5|d6< d7|d6< d8|d9< d:|d9< d;|d< d<|d< d=|d>< d?|d>< d@|dA< dB|dA< dC|dD< dE|dD< dF|dG< dH|dG< tg dI}|d }tdJ}t|f}t|t|f}td|}t|D ]V}|| | | }t	|||< || | | }t|t||  }tdK|t	| | d  | ||d d f< ||d d f ||d d f |k ||d d f< qOt| |
 |	|
  }dLdtdtj td|	d  |	d    }tdM| d  }t| dt||
 t|	|
   |||	|	|
 |dNdOd dNdP
\}}} tt| | d}!|!d dQd d f }!t|dt||
 t|	|
   |||	|	|
 |dNdOd dNdP
\}}} tt| | d}"|"d dQd d f }"||!}#dt|# }$dR|$|$dRk < ||"}%dt|% }&dR|&|&dRk < tj|$ddS}'tj|&ddS}(tj|$ddS})tj|&ddS}*|'j dQ }+t|'},t|(}-t|+D ]1}.t|'d d |.f |$d d |.f |,d d |.f< t|(d d |.f |&d d |.f |-d d |.f< q|||) |$d dQd d f   }/|||, |$d dQd d f   }0|/|0 }1|||* |&d dQ   }2|||- |&d dQd d f   }3|2|3 }4|1|4 dT }tj||'|( d  ddS}5|5tj|ddS }5t |5}5|5d ttt|5|  }5t!|5S )UNro   r   r   r:   r   r;   r<   r   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   r   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   )~jth?r   r   y&1|?g{Gz?Mb?r    rh?r   gI+?S㥛?gy&1?r   gMb?g rh?gQ?gl?;On?r   gL7A`?r   gV-?r   9v?r   r}   r~   r   g      ?FTr   r   i)axisg       @)"r   r   r   r   r   r   r   r    r!   r"   r   r   r   r   r   r%   r   r   r   r#   r$   sqrtr'   r   r&   r   r   r(   diffr   r   r   r   r)   )6r*   r+   r,   r-   r.   KmaxKlocmaxr   r   r/   r0   r   r   r   r   r   r   Wr   r   r   r   r   r   r   r   r   r   r3   scaler   r   r   r   	proc_specr   log_clean_energyproc_energylog_proc_energylog_clean_energy_slopelog_proc_energy_slopedBMax_cleandBMax_processedr   clean_loc_peaksproc_loc_peaksr   
Wmax_cleanWlocmax_cleanW_clean	Wmax_procWlocmax_procW_procr   r   r   r   wss+  s  
040




2   

r   c           
      C   s  |dksJ t | ||}t| ||}|du rtd d}t| ||}t|| |d}dd|  d|  d	|  }td
|f}td|f}dd|  d|  d|  }td
|f}td|f}dd|  d|  d|  }	td
|	f}	td|	f}	||||	|fS )z:Computes composite measures: PESQ, CSIG, CBAK, COVL, SSNR.i>  NzError computing llrr   wbgX9v@gX9v?gK?g;On?r   rE   g/$?gd;O?r   gT㥛 ?g/$?g(\?gMb?)r   r   printr9   r   r   r   min)
r*   r+   r,   wss_distllr_meansegSNRpesq_mosCsigCbakCovlr   r   r   	composite  s$   r  )N)r   r   )numpyr   r   scipy.linalgr   scipy.signalr   r   r9   r   r   r   r   r   r  r   r   r   r   <module>   s    


 
)'
 @