Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись данных в wav файл, как записать сигнал синуса в wav файл? 
:(
    Опции темы
shell14
Дата 20.5.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.5.2006

Репутация: нет
Всего: нет



Подскажите как записать данные в wav файл? Я записал полностью структуру заголовка файла, все нормально. Интересуют вопрос именно запись данных в файл.
Особой сложности не возникает, потому что файл нужен mono, не сжатый (PCM), 44100 Hz, и 16 bit per sample. т.е. как я понимаю сами данные должны храниться в массиве 2байтовых слов, (например short подойдет?).
вот, теперь отдельно вопросы:
как правильно организовать цикл записи данных, т.е. как сделать выборку? например любой сигнал в форме sin, если я хочу записать файл ну скажем длительностью 30 секунд?    


typedef struct waveformat_tag { 
    WORD wFormatTag; // тип формата 
    WORD nChannels; // количество каналов (моно или стeрео) 
    DWORD nSamplesPerSec; // частота дискретизации 
    DWORD nAvgBytesPerSec; // скорость потока данных 
    WORD nBlockAlign; // выравнивание блока данных 
} WAVEFORMAT; 
PM MAIL   Вверх
GremlinProg
Дата 20.5.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



Если тебе нужен корректный WAV, который впоследствии можно было послушать, то разбирай структуру WAV файла. Общая структура RIFF файлов подробно, с примерами, описана в MSDN'е. Это набор функций mmio-. По вавам - не помню, врать не буду. WAV - эточастный случай RIFF. Обратись в раздел форума WinAPI, а лучше воспользуйся поиском. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
shell14
Дата 21.5.2006, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.5.2006

Репутация: нет
Всего: нет



GremlinProg, спасибо конечно, но с форматом я вроде как раз разобрался возникает именно проблема с данными... файл получаеться занимает n-ое колличество килобайт, но при этом winamp п оказывает 0 секунд 
PM MAIL   Вверх
shell14
Дата 21.5.2006, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.5.2006

Репутация: нет
Всего: нет



Хорошо, народ можете подсказать какой сигнал задать чтоб хоть какой-нибудь нормальный звук получился? ну например какие параметры для синуса? 
PM MAIL   Вверх
GremlinProg
Дата 21.5.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



Цитата

но при этом winamp п оказывает 0 секунд  

Chunk "data" значит имеет нулевую длину.

А сформировать любой сигнал - просто: заполни массив данных хотя бы так:
Выделить всёкод C++
1:
2:
    for(size_t i = 100;i--;)
        data[i]    = 32768;

Это будет гул на частоте дискретизации максимальной громкости
Выделить всёкод C++
1:
2:
3:
4:
5:
    for(size_t i = 100;i--;)
        if(!(i%10))
            data[i]    = 0;
        else
            data[i]    = 32768;

Это еще простенький примерчик, разницу сам услышишь.
в обоих примерах используется 16 битное ИКМ с одним каналом на 100 семплов 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
shell14
Дата 21.5.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.5.2006

Репутация: нет
Всего: нет



GremlinProg, спасибо, все заработало!!! у меня действительно был баг с записью размера!
только теперь остался один вопрос, ведь чем больше будет время, тем соответсвенно получаеться больше размер данных. Но ведь я не могу выделить памать под бесконечный объем. 
я имею ввиду например, что для длительности 40 секунд мне нужно 
Выделить всёкод C++
1:
short DATA[1631700];
 элементов... а что делать если мне нужен сигнал боьшей длительности?

Просто я организовал выборку данных в массив циклом по времени.
Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
count = double(1.0/(write->head.nSamplesPerSec));//write->head.nSamplesPerSec = 44100 частота    
long size = time/count;//определяю размер данных
short DATA[size];
double j = count;
     while (count < time)
        
     {
        
    
      d = 100*sin(* pi * (* count) * (500 * count));
        count += j;    
      
        DATA[i] = d;
        i++;
    
    }
 
PM MAIL   Вверх
regis
Дата 22.5.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: 2
Всего: 7



Цитата(shell14 @ 21.5.2006,  13:50)
GremlinProg, спасибо, все заработало!!! у меня действительно был баг с записью размера!
только теперь остался один вопрос, ведь чем больше будет время, тем соответсвенно получаеться больше размер данных. Но ведь я не могу выделить памать под бесконечный объем. 
я имею ввиду например, что для длительности 40 секунд мне нужно 
Выделить всёкод C++
1:
short DATA[1631700];
 элементов... а что делать если мне нужен сигнал боьшей длительности?
[/code]

Буферизовать данные в памяти и время от времени дописывать в файл, естественно. 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
shell14
Дата 24.5.2006, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.5.2006

Репутация: нет
Всего: нет



ааа, точно, спасибо 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1131 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.