2016-01-02 3 views
0

Программирование Newb здесь пытается работать со звуком в первый раз (желая сделать программу, которая ломтиков звуковой файл на определенном уровне в децибелах)Итерация над списком не работает, как я себе представлял. Зачем?

wf = wave.open('test.wav', 'r') 

wfArraydB = [] 

for i in range(0, wf.getnframes()): # For every frame/sample, this loop is performed. 
    waveData = wf.readframes(1) # Can only do 1 frame because struct.unpack can only do 1 frame 
    data = struct.unpack("<h", waveData) # Converts wave data from hexadecimal 
    a = wf.tell() # Returns the frame that the file pointer is at 
    cf = copysign(data[0], 1) # Converts wave data 
    #print("data[0]: %d, cf: %d, cf/32767: %d" % (data[0], cf, cf/32767)) 
    if data[0] != 0: # Eliminates a math module error if the wave sample value is 0 
     b = 20 * log10(cf/32767) # Converts non-hexadecimal wave data to dB format 
    else: 
     b = -90 
    #print("frame %d: %d dB" % (a, b)) 
    wfArraydB.append(int(b)) 


acceptableLvl = [] 
acceptableLvlPre = [] 
threshold = -40 

for i in range(0, len(wfArraydB)): 
    if wfArraydB[i] > threshold: 
     acceptableLvlPre.append(i) 

    if wfArraydB[i] < threshold: 
     if len(acceptableLvlPre) > 4410: # If sequence of frames over -40 is longer than 4410 samples or 0.1s 
      acceptableLvl.append(acceptableLvlPre) # Stores frames in which there is sufficiently loud sound 
      acceptableLvlPre[:] = [] # Remove all contents from pre-list (using slice assignment) 

print(acceptableLvl) 

Когда я делаю оттиск (acceptableLvl) Я ожидал чтобы просмотреть список списков, которые имеют два требования: 1. Все значения превышают -40 (дБ, работают со звуковым файлом) и 2. все списки имеют длину более длинную, чем 4410 выборок (0,1 секунды).

Вместо этого списка, который возвращается содержит 13 repititions одного и того же списка, который содержит только 12 значений индекса (которые все ближе к концу второго звукового файла ~ 2 @ 44.100 герц)

[[85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039], [85368, 87027, 87028, 87029, 87030, 87031, 87032, 87035, 87036, 87037, 87038, 87039]] 

Не очень понимая, почему, поскольку он должен возвращать ценности намного больше, чем 80 000 выборок, так как в звуковом файле в начале и середине тоже есть громкость (от 10 000 до 50000 образцов)

Любая помощь с моим синтаксисом или любым другим оценил, спасибо

+0

Почему вы используете 'allowedLvlPre [:] = []'? –

+0

не уверен, что на самом деле я просто подумал, что это будет делать то же самое, что и 'приемлемыйLvlPre = []' – jonnyg1986

ответ

1

Списки в Python являются изменяемыми. Ваш acceptableLvl имеет 13 ссылок на тот же список экземпляров acceptableLvlPre. Вы изменяете acceptableLvlPre, поэтому все копии изменены.

Решение прост: замените acceptableLvlPre[:] = [] на acceptableLvlPre = []. Затем будет создан новый список, и все будет хорошо.

Смежные вопросы