
     i+                         d dl m Z  d dlmZmZmZ d dlZddlmZ ddl	m
Z
mZ  ej        d          dd         Z G d	 d
e          Z G d d          ZdS )    copy)ListOptionalAnyN   )FrequencyBand)DecodedMessageFrequencyPeaki  c                   ,    e Zd ZddedefdZdefdZdS )
RingBufferNbuffer_sizedefault_valuec                     5t                               | fdt          |          D                        nt                               | d g|z             d| _        || _        d| _        d S )Nc                 .    g | ]}t                    S  r   ).0_r   s     Z/root/.openclaw/workspace/.venvs/songid/lib/python3.11/site-packages/shazamio/algorithm.py
<listcomp>z'RingBuffer.__init__.<locals>.<listcomp>   s!     Q Q Qm!4!4 Q Q Q    r   )list__init__rangepositionr   num_written)selfr   r   s     `r   r   zRingBuffer.__init__   su    $MM$ Q Q Q QeK>P>P Q Q QRRRRMM$ 4555 + !r   valuec                     || | j         <   | xj         dz  c_         | xj         | j        z  c_         | xj        dz  c_        d S )Nr   )r   r   r   )r   r   s     r   appendzRingBuffer.append   sK    #T]))Ar   N)__name__
__module____qualname__intr   r   r!   r   r   r   r   r      sV        " "C " " " " "C      r   r   c                   x    e Zd Zd Z	 dee         fdZ	 dee         fdZ	dee         fdZ
d Zd Zd	 Zd
 ZdS )SignatureGeneratorc                 :   g | _         d| _        t          dd          | _        t          ddg          | _        t          ddgdz            | _        d| _        d| _        t                      | _	        d	| j	        _
        d| j	        _        i | j	        _        d S )
Nr      r   r                g@   >  )input_pending_processingsamples_processedr   ring_buffer_of_samplesfft_outputsspread_fft_outputMAX_TIME_SECONDS	MAX_PEAKSr
   next_signaturesample_rate_hznumber_samplesfrequency_band_to_sound_peaksr   s    r   r   zSignatureGenerator.__init__   s     46% '(
 8Bdbc7d7d7d#4>J<5
 5
 5
 ;EA3:;
 ;
 ;
 !$
 -..-2*-.*<>999r   s16le_mono_samplesc                 &    | xj         |z  c_         d S r"   )r1   )r   r=   s     r   
feed_inputzSignatureGenerator.feed_inputK   s    %%);;%%%%r   returnc                 b   t          | j                  | j        z
  dk     rd S t          | j                  | j        z
  dk    r| j        j        | j        j        z  | j        k     s>t          d | j        j        	                                D                       | j
        k     r|                     | j        | j        | j        dz                       | xj        dz  c_        t          | j                  | j        z
  dk    r`| j        j        | j        j        z  | j        k     t          d | j        j        	                                D                       | j
        k     t          dd          | _        t          ddg          | _        t          ddgdz            | _        | j        S )	N   c              3   4   K   | ]}t          |          V  d S r"   )len)r   peakss     r   	<genexpr>z8SignatureGenerator.get_next_signature.<locals>.<genexpr>]   s9        $E

     r   r*   r   r+   r,   r-   r.   )rD   r1   r2   r8   r:   r9   r6   sumr;   valuesr7   process_inputr   r3   r4   r5   r<   s    r   get_next_signaturez%SignatureGenerator.get_next_signatureW   s   t,--0FFLL4$/0043IISPP.1D1SS#$ $  (,(;(Y(`(`(b(b     n 
 -d.DtG]`cGc.cd   ""c)"" $/0043IISPP.1D1SS#$ $  (,(;(Y(`(`(b(b     n  8Bdbc7d7d7d#4>J<5
 5
 5
 ;EA3:;
 ;
 ;
 ""r   c                     | j         xj        t          |          z  c_        t          dt          |          d          D ]6}|                     |||dz                       |                                  7d S )Nr   rB   )r8   r:   rD   r   do_fft!do_peak_spreading_and_recognition)r   r=   position_of_chunks      r   rI   z SignatureGenerator.process_inputq   s    **c2D.E.EE**!&q#.@*A*A3!G!G 	5 	5KK*+<?PSV?V+VWXXX224444	5 	5r   c                 ^   | j         j        t          |          z   }|| j         | j         j        |<   | j         xj        t          |          z  c_        | j         xj        dz  c_        | j         xj        t          |          z  c_        | j         | j         j        d          | j         d | j         j                 z   }t          j                            t          |z            }|j        dz  |j	        dz  z   dz  }t	          j
        |d          }| j                            |           d S )Nr*      i   g|=)r3   r   rD   r   npfftrfftHANNING_MATRIXrealimagmaximumr4   r!   )r   batch_of_128_s16le_mono_samples	type_ringexcerpt_from_ring_bufferfft_resultss        r   rL   zSignatureGenerator.do_fftw   s2   /83?^;_;__	+ 	#D$?$H9$TU 	#,,4S0T0TT,,#,,4,,#//37V3W3WW// '(C(L(N(NO)*PD,G,P*PQR 	! !#N=U,U V V"'*[-=q-@@WMjl;;,,,,,r   c                 z    |                                   | j        j        dk    r|                                  d S d S )N.   )do_peak_spreadingr5   r   do_peak_recognitionr<   s    r   rM   z4SignatureGenerator.do_peak_spreading_and_recognition   sE       !-33$$&&&&& 43r   c                      j          j         j        dz
           }t          j        |d                              d          }t          j        |d         d          |d<   t          j        |d         d          |d<   t          j        |                    d          d d	         |d	d          g          } fd
dD             \  }}}t          j        | j	        |          j	        |          j	        |         g          }t          j        |d dd d f         d          |d<   t          j        |d dd d f         d          |d<   t          j        |d dd d f         d          |d<   |d         
                                 j	        |<   |d         
                                 j	        |<   |d         
                                 j	        |<    j	                            t          |                     d S )Nr      )ra   r   r   rP   r   )axisc                 H    g | ]}j         j        |z   j         j        z  S r   )r5   r   r   )r   former_fft_numr   s     r   r   z8SignatureGenerator.do_peak_spreading.<locals>.<listcomp>   s?     
 
 
 #,~=AWAcc
 
 
r   )r   rd   i   )r4   r   rQ   tilereshaperollhstackmaxvstackr5   tolistr!   r   )r   origin_last_ffttemporary_array_1origin_last_fft_npi1i2i3temporary_array_2s   `       r   r^   z$SignatureGenerator.do_peak_spreading   s#   '+'78H8QTU8U'VGOQ77??HH!w'8';R@@!!w'8';R@@!Y(9(=(=1(=(E(Ecrc(JO\^\_\_L`'abb
 
 
 
".
 
 

B
 I"&r*&r*&r*	
 
  "v&7AAA&>QGGG!!v&7AAA&>QGGG!!v&7AAA&>QGGG!%6q%9%@%@%B%Br"%6q%9%@%@%B%Br"%6q%9%@%@%B%Br"%%d+=&>&>?????r   c           
         | j         | j         j        dz
  | j         j        z           }| j        | j        j        dz
  | j        j        z           }t	          dd          D ]}||         dk    r||         ||dz
           k    rud}g t	          dd	d
          d	dt	          ddd
          D ]}t          |||z            |          }||         |k    r"|}ddgt	          ddd          t	          ddd          D ]@}t          | j        | j        j        |z   | j        j        z           |dz
           |          }A||         |k    r| j        j        dz
  }t          j        t          d||                             dz  dz   }	t          j        t          d||dz
                               dz  dz   }
t          j        t          d||dz                                dz  dz   }|	dz  |
z
  |z
  }||
z
  dz  |z  }|dz  |z   }|dk    sJ |dz  }d|cxk     rdk     rn nt          j
        }nYd|cxk     rdk     rn nt          j        }n<d|cxk     rdk     rn nt          j        }nd|cxk     rdk    rn nt          j        }n/|| j        j        vrg | j        j        |<   | j        j        |                             t#          |t%          |	          t%          |          d                     d S )Nr]   1   
   i  g      ?r   r   ird   ra   rP   	   ii               g33333@i       @   g     @?i  i  i  i|  r0   )r4   r   r   r5   r   rl   r   rQ   logr	   
hz_250_520hz_520_1450hz_1450_3500hz_3500_5500r8   r;   r!   r   r&   )r   fft_minus_46fft_minus_49bin_positionmax_neighbor_in_fft_minus_49neighbor_offset#max_neighbor_in_other_adjacent_fftsother_offset
fft_numberpeak_magnitudepeak_magnitude_beforepeak_magnitude_afterpeak_variation_1peak_variation_2corrected_peak_frequency_binfrequency_hzbands                    r   r_   z&SignatureGenerator.do_peak_recognition   s    '&+t/?/KK
 -#,r1T5K5WW
 ""dOO T	 T	L L)V33\*l<!;K.LLL 01,'SsB):):'SB'S'SE!QPQNN'S  O36$\O%CD44 400
  -0LLL ;W7 ) sC++) sC++	)   ?B 2!%!7!@<!O"&"8"D!E +Q.0 @? ?;; $L14WWW &*%;%G"%L
 F3v|L/I#J#JKKfTW[[ ' F3v|L1<L/M#N#NOORXX[__ . F3v|L1<L/M#N#NOORXX[__ -
 +Q.1FFI]] ) 24IIRORbb ) 8Db7HK[7[4/!3333'CG\']333333333#0#;DD <6666$66666#0#<DD!L7777477777#0#=DD!L8888D88888#0#=DD$t':'XXXVXD/MdS+I$OVV) * #N 3 3 #$@ A A %	   [T	 T	r   N)r#   r$   r%   r   r   r&   r?   r   r
   rJ   rI   rL   rM   r^   r_   r   r   r   r(   r(      s        $? $? $?L<T#Y < < < <#H^$< # # # #45S	 5 5 5 5- - -0' ' '
@ @ @B\ \ \ \ \r   r(   )r   typingr   r   r   numpyrQ   enumsr	   	signaturer
   r   hanningrT   r   r   r(   r   r   r   <module>r      s          & & & & & & & & & &                 4 4 4 4 4 4 4 4D!!!B$'       &s s s s s s s s s sr   