Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2013, 20:24   #11
Mago
Пользователь
 
Регистрация: 24.07.2008
Сообщений: 23
По умолчанию

Потихоньку разбираюсь. 16 бит уже не влазит в чар, насколько я понял. И еще, функция file.read в качестве первого параметра принимает только char, который от -128 до 127, поэтому абсолютная тишина кодируется как -128. И в том месте, где складывается два тихих места получается -128-128. Записывается 0, что уже не тишина. Видимо, нужно другими средствами считывать сэмплы, ибо 16 бит не влазит в чар, как я уже написал.

С 8-биткой разобрался путем прибавления 128 ко всем элементам pData перед дальнейшими действиями. Перед записью в новый файл вычитание 128.

И это всё еще только моно. Уф.
Mago вне форума Ответить с цитированием
Старый 01.02.2013, 15:40   #12
Mago
Пользователь
 
Регистрация: 24.07.2008
Сообщений: 23
По умолчанию

Начитался я. С 16 биткой достаточно сложно всё уже, ибо каждый сэмпл состоит из двух подряд идущих однобайтовых 16-ричных чисел (а не одного большого двухбайтового числа, как я думал), например: 65 02. И читать БАЙТЫ нужно справа налево, то есть это число 265, которое дает значение амплитуды 613. Теперь стоит вопрос о том, как складывать всё это дело с другими отсчетами при эхо.

Последний раз редактировалось Mago; 01.02.2013 в 15:41. Причина: Поправка
Mago вне форума Ответить с цитированием
Старый 01.02.2013, 16:17   #13
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Не забудьте, что если вы перейдете на формат 16 бит то дело кончится переполнением 16 бит. Нужно делать нормализацию сигнала, чтоб вернуть в пределы нужного количества бит. Самый простой способ - делить на количество каналов (т.е. в данном случае на два). Т.е. будет чтото вроде:
(char) ((((int) sample1) + ((int) sample2)) / 2)
Так сумма и деление будут 32бит, результат будем загонять обратно в 8 бит.
Для результатов получше нужен более сложный алгоритм, но суть дела от этого не меняется.
waleri вне форума Ответить с цитированием
Старый 01.02.2013, 23:44   #14
Mago
Пользователь
 
Регистрация: 24.07.2008
Сообщений: 23
По умолчанию

Сделал вот функцию, которая принимает два интегера (считанные чары), соединяет их в один hex чар и выдает интегеровское значение амплитуды (для 16 бит). Далее все операции будут с такими амплитудами (со слежкой, чтоб не перевалило за 32767 и -32768). А перед записью в новый файл обратное преобразование в два чара.

И мне, кстати, нужны наилучшие алгоритмы, так как это лишь фундамент, с которым я хочу разобраться. А дальше будет внедрение цифрового водяного знака эхо методом (дипломный проект). Так что, разбираюсь очень глубоко)

Последний раз редактировалось Mago; 01.02.2013 в 23:47. Причина: !
Mago вне форума Ответить с цитированием
Старый 01.02.2013, 23:48   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

разве в wav-16 бит сэмплы храняться в BigEndian?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.02.2013, 03:38   #16
Mago
Пользователь
 
Регистрация: 24.07.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
разве в wav-16 бит сэмплы храняться в BigEndian?
little-endian, как говорят мне источники. "Это означает, что младшие байты идут вначале и читать байты надо справа налево (при этом пары шестнадцатиричных цифр в самих байтах переставлять не надо)." А big-endian - наоборот, насколько я понял.

Последний раз редактировалось Mago; 02.02.2013 в 03:39. Причина: правка
Mago вне форума Ответить с цитированием
Старый 02.02.2013, 06:05   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

к вашему сведению перестановки байт нужны тока если проц применяет иной порядок байт.
вы на обычном компе судя по коду, а значит один сэмпл это просто signed short(можно без signed)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.02.2013, 00:57   #18
Mago
Пользователь
 
Регистрация: 24.07.2008
Сообщений: 23
По умолчанию

"Следует иметь в виду, что в файлах формата RIFF WAVE при записи чисел принят порядок следования байтов, именуемый little-endian. Это означает, что младшие байты идут вначале и читать байты надо справа налево (при этом пары шестнадцатиричных цифр в самих байтах переставлять не надо). Это вызвано тем, что процессор от Intel именно в таком порядке читает числа." Так вот говорит литература. Проверю всё это в Cool Edit Pro, ибо там можно смотреть амплитуду каждого сэмпла. Вроде бы похоже на правду.
Mago вне форума Ответить с цитированием
Старый 03.02.2013, 01:46   #19
Mago
Пользователь
 
Регистрация: 24.07.2008
Сообщений: 23
По умолчанию

У меня процессор AMD. Просмотрел амплитуды с помощью wav2text, байты справа налево.
Mago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со звуком 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