Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 15, 2009 21:26:10

kzoi_py
От:
Зарегистрирован: 2009-02-01
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Обсуждаем модуль wave

Доброго времени суток всем питонерам. Вот решил заняться обработкой сигнала, но гуру в этой области не являюсь (((( вот банальная проблемма… получить массив квантованных амплитуд. За ранее спасибо всем :)



Офлайн

#2 Июнь 16, 2009 10:55:29

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Обсуждаем модуль wave

Думаю здесь лучше воспользоваться scikits.audiolab(http://www.ar.media.kyoto-u.ac.jp/members/david/softwares/audiolab/index.html), тк wave мало чего умеет.

>>> import scikits.audiolab as alab
>>> import pylab
>>> wav = alab.Sndfile('dapa.wav', 'r')
>>> frames = wav.read_frames(100000)
>>> frames # Искомые данные для левого и правого каналов соответственно
array([[ 0. , 0. ],
[ 0. , 0. ],
[ 0. , 0. ],
...,
[-0.02703857, 0.17633057],
[-0.04229736, 0.21157837],
[ 0.0453186 , 0.24536133]])
>>> pylab.plot(frames) # так же для наглядности можно построить график с формой сигнала
[<matplotlib.lines.Line2D object at 0x9106dec>, <matplotlib.lines.Line2D object at 0x9114c0c>]
>>> pylab.savefig('waveform')
>>> pylab.show()
>>>



Офлайн

#3 Июнь 21, 2009 11:32:36

kzoi_py
От:
Зарегистрирован: 2009-02-01
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Обсуждаем модуль wave

Может я чего делаю не так но… Амплитуды которые я поменял не сохраняются (((( вот код…

# -*- coding: cp1251 -*-
import pylab, lambda_lib as lmb, math, array
import scikits.audiolab as alab
import numpy as nm

class mkernel():
N = 0 #отсчёты
frames = [] #фреймы
it = [] #для итераций
buff = '' #входной поток
stack = [] #стек данных
fname = 'in.txt' #источник данных
mcon = '222.wav' #медиа контейнер
cval = 0 #число занимаемых бит
sym,sym2 = 0,0 #Пара кодов буквы для одного момента времени.

def __init__(self):
self.makeBuff()
self.makeStream()
self.process()
#self.extract()

def dec2bin(self, ttm): #Вход - число, выход - self.it
lmb.pop_l(self.it,0)
if ttm > 1:
while ( ttm >= 1):
ost = math.fmod(ttm, 2)
ttm /= 2
self.it.append(int(ost))
self.it.reverse()
else:
self.it.append(ttm)
if (int(math.fmod(len(self.it), 8)) <> 0):
while (int(math.fmod(len(self.it), 8)) <> 0):
self.it.insert(0,0)

def bin2dec(self, z): #вход - двоичный кортеж, выход - число
g=0
z.reverse()
for i in range(0,len(z)):
if (z[i]==1):
g+=pow(2,i)
return g

def makeBuff(self):
fp = open(self.fname,'rb')
i = 0
while fp.read(1):
fp.seek(i)
self.buff += fp.read(100)
i+=100
print 'Размер буфера#', len(self.buff)
self.buff += '#'

def makeStream(self):
wav = alab.Sndfile(self.mcon, 'r')
self.N = wav.nframes
self.frames = wav.read_frames(self.N)
print wav.format

def sci2cor(self,tmp):
flag = 0
tmp = str(tmp)
if 'e' in tmp:
flag = 1
vesh = lmb.push_ld(tmp, [])
#print vesh
if flag <> 1:
return [vesh,['x']]
else:
mantissa = []
i = len(vesh)-1
while vesh[i] <> 'e':
mantissa.append(vesh.pop(i))
i -= 1
mantissa.append(vesh.pop(i))
mantissa.reverse()
return [vesh, mantissa]

def ex_chanel(self, tsym, tframe): #Обработка одного канала
k = 0
while k < 3:
tframe[0].pop()
k += 1
tframe[0].extend(tsym)
#А есть ли экспонента?
if len(tframe[1]) > 2:
tframe[0].extend(tframe[1])
p =''
while len(tframe[0]) <> 0:
p += str( tframe[0].pop(0) )
p = nm.float64(p)
return p

def process(self):
s,s2,res = [],[],[] #Itog
ef1, ef2, bit, i, j = 0,0,0,0,0 #Флаги для обработки исключений
#бит проверки, индекс амплитуды, символа
while j < len(self.buff):
try:
if bit <> 1: #Если оодна из амплитуд 1 или 0 то бит равен 1
ef1 = 1
sym1 = lmb.push_ld( str(ord( self.buff[j])), [])
ef2 = 1
sym2 = lmb.push_ld( str(ord( self.buff[j+1])), [])
while len(sym1) < 3:
sym1.insert(0,'0')
while len(sym2) < 3:
sym2.insert(0,'0')
else: #Иначе возьмём другую пару амплитуд
bit = 0
except IndexError:
pass
if ef1 <> 0:
x = self.sci2cor( str(self.frames[i][0]) )
if len(x[0]) > 9:
s = self.ex_chanel(sym1, x)
if ef2 <> 0:
y = self.sci2cor( str(self.frames[i][1]) )
if len(y[0]) > 9:
s2 = self.ex_chanel(sym2, y)
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if ef1 < 0:
s = self.frames[i][0]
if ef2 < 0:
s2 = self.frames[i][1]
res.append([s,s2])
j+=2
i+=1
ef1, ef2 = 0, 0
else:
bit = 1
i += 1
print 'Фреймов#', len(res)
fmt = alab.Format('wav', 'pcm16')
afile = alab.Sndfile('ff.wav', 'w', fmt, 2, 44100)
afile.write_frames( nm.array(res) )
afile.close()

def extract(self):
stop = 0x23
s, s2 = '', ''
j = 0
sbuff = ''
fp=open('res.txt','a')
for i in range(0, len(self.frames)):
x = self.sci2cor(self.frames[i][0])
y = self.sci2cor(self.frames[i][1])
j = 3
while j <> 0 :
s += x[0].pop()
s2 += y[0].pop()
j -= 1
sbuff += chr(s)+chr(s2)
fp.write(sbuff)
fp.close()

app = mkernel()
Файл lambda_lib
# -*- coding: cp1251 -*-
def push_ld(num, ls):
for i in range(0,len(num)):
ls.append(num[i])
return ls

def pop_ld (ls):
for i in range(0, len(ls)):
ls.pop()

push_l = lambda ls,num,i: [ls.append(int(num[i])) for i in range(0,len(num))]
pop_l = lambda ls,i: [ls.pop() for i in range(0,len(ls))]
pop_tree = lambda ds,ds2,i: [ds.append(ds2.pop(0)) for i in range(0,3)]



Отредактировано (Июнь 21, 2009 11:39:41)

Офлайн

#4 Июнь 22, 2009 11:49:31

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Обсуждаем модуль wave

Значит дело в логике программы. Сделай отладочный вывод при формировании res и посмотри что обрабатывается не так как было задумано. Точнее солжно что-то сказать, тк времени копать этот код нет, да и задачу ты не описал.



Офлайн

#5 Июнь 23, 2009 08:43:03

kzoi_py
От:
Зарегистрирован: 2009-02-01
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Обсуждаем модуль wave

В общем я занимаюсь стеганографией. Хочу взять амплитуды сигнала и в незначащих знаках мнимой части числа хранить информацию. В данном случае код символа. То есть по логике берём амплитуды, преобразуем число в научном представлении) в кортеж. Откидываем 3 знака, и ставим свои. После этого восстанавливаем амплитуды (для сохранения) и сохраняемся. К примеру возьмём 4 буквы (слово 1234). Для кодирования однойбуквы мы используем один канал. Тоесть отсчёт содержит 2 канала, по тому может за раз кодировать 2 буквы. Получаем вот что:

Воозьмём -0.0001220703125. Заменяем 3 знака мнимой части уодом 049. Получаем -0.0001220703049

Вот функция Init для этой процедуры
def __init__(self):
self.makeBuff()
self.makeStream()
self.process()
#self.extract()
Соответственно перед сохранением мы возвращаем всё назад. Сохараняем и…
закоментим makebuff и process. Остальное открыто и в классе укажем новый (с текстом) звуковой файл. Теперь читаем. Первый канал первого отсчёта должен содержать наши данные (-0.0001220703049) но… мы видим -0.0001220703125 (как будто ничего не сохраняли а так и сбросили прочитанный диапазон в новый файл. Я говорил об этом :) за ранее извините за такие замуты.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version