Как волновые файлы хранят несколько каналов? - PullRequest
1 голос
/ 04 июня 2010

Я создал два волновых файла, используя Audacity. Оба имеют частоту дискретизации 44100 Гц, 32-битные плавающие сэмплы, были сохранены как 16-битные WAV (Microsoft) со знаком и содержат 1 секунду тишины (согласно Audacity). Разница в том, что один файл содержит один канал, а другой - два (стерео). При чтении файла с одним каналом я получил такие кадры:

0x00 0x00  
...  ...  

Так же, как и ожидалось, но при чтении второго файла я получил:

0x00 0x00 0x00 0x00  
0x01 0x00 0xff 0xff  
0x00 0x00 0x00 0x00  
0x00 0x00 0x01 0x00  
0xff 0xff 0x01 0x00  
0xfe 0xff 0x03 0x00  

Мне кажется, это случайная картина. Это как-то связано с тем, как каналы хранятся в волновом файле? Разве это не должно быть что-то вроде:

0x00 0x00 0x00 0x00  
...  ...  ...  ...  

PS: я использовал встроенный модуль python 'wave' для чтения файлов.

Ответы [ 5 ]

3 голосов
/ 15 декабря 2010

Данные не случайны

Глядя на это, мне кажется, что я вижу 2 значения типа int на строку, каждый из которых 2 байта в младшем порядке:

0x00 0x00 0x00 0x00  
0x01 0x00 0xff 0xff  
0x00 0x00 0x00 0x00  
0x00 0x00 0x01 0x00  
0xff 0xff 0x01 0x00  
0xfe 0xff 0x03 0x00  

Расшифровывается как:

 0  0
 1 -1
 0  0
 0  1
-1  1
-2  3

Таким образом, вы видите, что числа, очень близкие к 0 (почти тишина), кажутся джиттерами, как предлагали другие.

1 голос
/ 05 июня 2010

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

1 голос
/ 04 июня 2010

Из того, что я помню, каналы должны чередоваться, поэтому 1 секунда из 44,1 кГц будет потоком 88 200 тыс. Сэмплов, чередующимся влево и вправо или как там говорится в спецификации.

Также Audacity не должен получать float -> int-преобразование неправильно, только наоборот. Попробуйте начать с целочисленных выборок, а не с точки плавания. Или иметь один канал с известным значением (т. Е. Ox8f8f), а другой - 0, который может быть легче выяснить.

0 голосов
/ 05 июня 2010

Вы можете увидеть, что это за цифры с этим кодом:

import struct
struct.unpack("f", struct.pack("I", 0xfeff0300))
(-1.6948435790786458e+38,)

Все они кажутся очень маленькими, возможно, бесшумными числами. Я генерировал тишину и сохранял ее как 32-битный WAV с плавающей запятой и не получал небольшие числа. Мой файл содержал нули, исключая заголовок.

0,2 секунды без вывода сообщений, 2-канальные данные с плавающей запятой могут быть сгенерированы следующим образом:

import array
silence = array.array("f", [0] * int(44100 * 2 * 0.2))
0 голосов
/ 04 июня 2010

удаленный код и предыдущий пост.

Тишина: "реальная" тишина должна быть нулевой. В противном случае его часто называют «тишиной комнаты», очень маленьким шумом, который присутствует везде, если вы не используете шумовые ворота. (Запись) Это просто идея: помните, что использование значений со знаком приведет к использованию 1 бита для маркера со знаком / без знака. Возможно (я не знаю) это то, что вы видите после преобразования его в подписанный волновой файл с использованием Audacity. Извините, но у меня нет времени, чтобы проверить это.

Волновые файлы: Я не знаю, сколько вы знаете о звуковых файлах, но: Если вы просто хотите добавить тишину, попробуйте это так: Каждый образец имеет размер X битов, поэтому вам нужно X / 8 байтов для одного образца. Вы знаете частоту дискретизации, поэтому вы можете просто скопировать исходный необработанный байтовый массив в один из файлов размера (silence_length_in_samples bytes_per_frame) + (оригинал) + (silence_length_in_samples bytes_per_frame) и просто записать его обратно в звуковой файл, используя Инструменты Python, которые, я надеюсь, могут это сделать.

2 канала: Необработанные байты организованы в: [sample1 (channel1_bytes, channel2bytes)] [sample2 (channel1_bytes, channel2_bytes) .... Надеюсь понятно что я имею ввиду:)

...