[Fr .Dat ] = w f l . r e a d ( ’ka .wav ’ ) ################################ # функция, генерирующая матрицу de f c r e a t eV e c s ( I n ,N ) : Out = [] Beg = О End = Beg + N wh i le End < = l e n ( I n ) : Span = In[Beg:End] Out. append(Span) Beg += 1 End = Beg +N re turn n p . f l o a t 3 2 ( 0 u t ) ########################## def c r e a t eW a t e r ( In ,N ,P o s ) : VecM = c r ea t eVec s ( In [Po s - 10:Pos +N + 1 0 ] ,N) Matr = n p . d o t (VecM.T,VecM) # Собственные значения и собственные векторы E,V = l a . e i g (M a t r ) re turn n p . r e a l ( V [ : ,N -1 ] ) ###################### Pos = 13000 N = 127 # длина водяного знака # Минимальное собственное значение # стоит на последнем месте Dat l = n p . f l o a t 3 2 (D a t ) Wtr = crea t eWa te r (Da t l ,N , Pos) D a t l [ P o s :Pos+N] += Wtr # вставка водяного знака Out = np . c o r r e l a t e (D a t l [P o s - 1 0 :P o s + N + 1 0 ] ,Wtr) p i t . p l o t (O u t , ’k ’ ) Результат работы программы представлен на рис. 2.6. Как следует из рисунка, водяной знак обнаруживается без труда по максимуму корреляции при смещении окна на 10 отсчетов, начиная с левого конца фрагмента.
RkJQdWJsaXNoZXIy MTExODQxMg==