Программирование 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 образцов)
Любая помощь с моим синтаксисом или любым другим оценил, спасибо
Почему вы используете 'allowedLvlPre [:] = []'? –
не уверен, что на самом деле я просто подумал, что это будет делать то же самое, что и 'приемлемыйLvlPre = []' – jonnyg1986