|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
31.01.2013, 20:24 | #11 |
Пользователь
Регистрация: 24.07.2008
Сообщений: 23
|
Потихоньку разбираюсь. 16 бит уже не влазит в чар, насколько я понял. И еще, функция file.read в качестве первого параметра принимает только char, который от -128 до 127, поэтому абсолютная тишина кодируется как -128. И в том месте, где складывается два тихих места получается -128-128. Записывается 0, что уже не тишина. Видимо, нужно другими средствами считывать сэмплы, ибо 16 бит не влазит в чар, как я уже написал.
С 8-биткой разобрался путем прибавления 128 ко всем элементам pData перед дальнейшими действиями. Перед записью в новый файл вычитание 128. И это всё еще только моно. Уф. |
01.02.2013, 15:40 | #12 |
Пользователь
Регистрация: 24.07.2008
Сообщений: 23
|
Начитался я. С 16 биткой достаточно сложно всё уже, ибо каждый сэмпл состоит из двух подряд идущих однобайтовых 16-ричных чисел (а не одного большого двухбайтового числа, как я думал), например: 65 02. И читать БАЙТЫ нужно справа налево, то есть это число 265, которое дает значение амплитуды 613. Теперь стоит вопрос о том, как складывать всё это дело с другими отсчетами при эхо.
Последний раз редактировалось Mago; 01.02.2013 в 15:41. Причина: Поправка |
01.02.2013, 16:17 | #13 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Не забудьте, что если вы перейдете на формат 16 бит то дело кончится переполнением 16 бит. Нужно делать нормализацию сигнала, чтоб вернуть в пределы нужного количества бит. Самый простой способ - делить на количество каналов (т.е. в данном случае на два). Т.е. будет чтото вроде:
(char) ((((int) sample1) + ((int) sample2)) / 2) Так сумма и деление будут 32бит, результат будем загонять обратно в 8 бит. Для результатов получше нужен более сложный алгоритм, но суть дела от этого не меняется. |
01.02.2013, 23:44 | #14 |
Пользователь
Регистрация: 24.07.2008
Сообщений: 23
|
Сделал вот функцию, которая принимает два интегера (считанные чары), соединяет их в один hex чар и выдает интегеровское значение амплитуды (для 16 бит). Далее все операции будут с такими амплитудами (со слежкой, чтоб не перевалило за 32767 и -32768). А перед записью в новый файл обратное преобразование в два чара.
И мне, кстати, нужны наилучшие алгоритмы, так как это лишь фундамент, с которым я хочу разобраться. А дальше будет внедрение цифрового водяного знака эхо методом (дипломный проект). Так что, разбираюсь очень глубоко) Последний раз редактировалось Mago; 01.02.2013 в 23:47. Причина: ! |
01.02.2013, 23:48 | #15 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
разве в wav-16 бит сэмплы храняться в BigEndian?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
02.02.2013, 03:38 | #16 |
Пользователь
Регистрация: 24.07.2008
Сообщений: 23
|
little-endian, как говорят мне источники. "Это означает, что младшие байты идут вначале и читать байты надо справа налево (при этом пары шестнадцатиричных цифр в самих байтах переставлять не надо)." А big-endian - наоборот, насколько я понял.
Последний раз редактировалось Mago; 02.02.2013 в 03:39. Причина: правка |
02.02.2013, 06:05 | #17 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
к вашему сведению перестановки байт нужны тока если проц применяет иной порядок байт.
вы на обычном компе судя по коду, а значит один сэмпл это просто signed short(можно без signed) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
03.02.2013, 00:57 | #18 |
Пользователь
Регистрация: 24.07.2008
Сообщений: 23
|
"Следует иметь в виду, что в файлах формата RIFF WAVE при записи чисел принят порядок следования байтов, именуемый little-endian. Это означает, что младшие байты идут вначале и читать байты надо справа налево (при этом пары шестнадцатиричных цифр в самих байтах переставлять не надо). Это вызвано тем, что процессор от Intel именно в таком порядке читает числа." Так вот говорит литература. Проверю всё это в Cool Edit Pro, ибо там можно смотреть амплитуду каждого сэмпла. Вроде бы похоже на правду.
|
03.02.2013, 01:46 | #19 |
Пользователь
Регистрация: 24.07.2008
Сообщений: 23
|
У меня процессор AMD. Просмотрел амплитуды с помощью wav2text, байты справа налево.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа со звуком | bonjovi | Паскаль, Turbo Pascal, PascalABC.NET | 14 | 12.02.2012 19:04 |
Работа со звуком | Drulya | C# (си шарп) | 4 | 12.09.2011 11:58 |
работа со звуком | Garic_ | Помощь студентам | 19 | 15.12.2009 19:39 |
Работа со звуком | Claptrap | Мультимедиа в Delphi | 7 | 06.11.2009 13:42 |
Работа со звуком | Claster | Мультимедиа в Delphi | 1 | 19.05.2009 13:28 |