o
    toi                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlm	Z
 d dlmZ d ddd	Zd
d ZddddZddddZG dd deZdS )    )annotationsN)OpRun)_concat_from_sequence)_cfft)_sliceaxisc                 G  s   t j|| dS )Nr   )npconcatenate)r   args r   N/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops/op_stft.py_concat   s   r   c                 C  sj   zt j| |dW S  ty4   t|dkr"t j| t|d d Y S t|D ]	}t j| |d} q&|  Y S w )Nr      r   )r	   expand_dims	TypeErrorlentuplereversed)ar   xr   r   r   
_unsqueeze   s   r   F
fft_lengthintc                 C  s<  t | jd }dg}dg}|jd }	g }
t|D ]P}|| }||	 }t| t|gt|g|}|jdd }|	|d  f}|jdd | |jdd  }tj|| jd}t||dd}t	||}|

| qt|
ddd	}|j}|dd }td
d |D }g ||	dR }t||}|| }t||||ddS )zApplies one dimensional FFT with window weights.

    torch defines the number of frames as:
    `n_frames = 1 + (len - n_fft) // hop_length`.
    r   r   Ndtyper   r   new_axisc                 s  s    | ]}d V  qdS )r   Nr   ).0_r   r   r   	<genexpr>A   s    z_stft.<locals>.<genexpr>F)onesided	normalize)r   shaperanger   r	   arrayzerosr   r   r   appendr   r   reshape_dft)r   r   
hop_lengthn_frameswindowr$   	last_axisr   axis2window_sizeseqfsbeginendsliced_xnew_dimmissing	new_shapecstpad_sliced_xun_sliced_xnew_xshape_xshape_x_shortshape_x_short_onewindow_shapeweightsweighted_new_xr   r   r   _stft   s4   
 

rE   c           4      C  s  dg}dg}dg}dg}| j d }	|||	d   }
g }g }g }t|	D ]}|}|d }tjt| t|gt|g||d d}t||d|dd}t|j }|d }t|t|t||g}tj||d}tj|j d| j	d	| }|j d
d }|| }|j d }|
||  }g ||R }g ||R }tj
|| j	d}tj
|| j	d}t|||dd} t|||dd}!t|t|t||g}tj||d}"t||"|dd}#|t| dd |t|#dd |t|!dd q#t|ddd}$t|ddd}%t|ddd}&|$jddd}'|%jddd}(|&jddd})|'|) }*|(|) }+tj|*dd},tj|+dd}-t|,|-dd}.|.j }/|.d}0t|0d}1|/dd
 }2t|2|dd}3|1|3S )zReverses of `stft`.r   r      r   r   r   T)r   r$   r%   )
fill_valuer   Nr   r   )r   keepdims)rF   r   )r   r   )r&   r'   r	   squeezer   r(   r,   r   fullr   r)   r   r*   r   r   sumr   r+   	transpose)4r   r   r-   r/   r$   zeroonetwoaxisfr.   expected_signal_lenseqrseqiseqcr4   r5   r6   frame_xiftn_dimsn_dims_1slicedytmpctmpshape_beginn_leftsizen_right
left_shaperight_shaperightleftyycitmpyiredrrediredcresrresirescrrrirr0ri0concresult_shapereshaped_result
transposedother_dimensionsfinal_shaper   r   r   _istftK   sn   




rx   c                   @  s   e Zd ZdddZdS )STFTNc           	      C  s|   |d u r|d u r|j d }n|j d }|}|d u r"tj|f|jd}d|j d | |  }t||||||d}||jfS )Nr   r   r   r   )r$   )r&   r	   onesr   rE   astype)	selfr   
frame_stepr/   frame_lengthr$   r-   r.   resr   r   r   _run   s   
z	STFT._run)NNN)__name__
__module____qualname__r   r   r   r   r   ry      s    ry   )F)r   r   )
__future__r   numpyr	   onnx.reference.op_runr   *onnx.reference.ops.op_concat_from_sequencer   onnx.reference.ops.op_dftr   r,   onnx.reference.ops.op_slicer   r   r   rE   rx   ry   r   r   r   r   <module>   s   -P