Войти

Показать полную графическую версию : Delphi, wav


Roman Go
04-12-2002, 15:06
Мне нужно загрузить файл с таким расширением и взять из него для начала амплитуды сигнала в единицу времени и на его основе строить графики и по полученным данным проводить расчеты... вообще то я понятия не имею даже с чего начать...

vasketsov
04-12-2002, 15:23
Roman Go
Начинайте всегда в таких случаях с msdn.microsoft.com (если под WIN, естественно)

Roman Go
05-12-2002, 08:09
msdn.microsoft.com а русский аналог есть...

noname00.pas
05-12-2002, 14:21
Roman Go
Начать тебе следует с того, чтобы найти файл с описанием формата WAV.

Roman Go
05-12-2002, 18:00
noname00.pas

http://www.625-net.ru/archive/z1099/9.htm
http://graphics.cs.msu.su/courses/cg02b/assigns/hw-2/help/wavfmt.htm

и что дальше... я не знаю как с этим работать...:(

noname00.pas
05-12-2002, 19:26
Roman Go
Отлично. Первая ссылка никуда не годится, а вот вторая хороша :-)

Теперь самое время понять, что же именно представляет из себя нужная тебе величина. Что есть "амплитуды сигнала в еденицу времени"?


Добавлено:

Зацените фишку: вторая ссылка ссылается прямо на сайт нашего факультета :-))

Roman Go
06-12-2002, 10:22
noname00.pas
Значение(я) сигнала(ов) в момент времени, т.е. время это ось Х, а значение Y... Мне дали задание проанализировать звук из файла, вот я и пытаюсь что-то делать...:(

Roman Go
07-12-2002, 08:02
http://www.rsdn.ru/ это не аналог случайно msdn.microsoft.com?

noname00.pas
07-12-2002, 22:21
Roman Go
Ну а какие тогда проблемы? :-)
Частота дискретизации в заголовке есть. Моно/стерео тоже есть. Даже разрядность есть. Значит сопоставить масштаб вертикальной и горизонтальной оси ты уже можешь :-)
А дальше собственно значения - они в блоке данных.

Я проблемы не вижу...

Исправлено: noname00.pas, 20:23 7-12-2002

Roman Go
09-12-2002, 07:20
А какой тип у этого wav, как его связать с переменной, как считывать данные из него я ничего не могу сделать... только сильно не пинайте, в книгах, которые у меня есть такого нету, помочь, так тоже никого на кафедре, программирующего не Delphi нет, вся информация через интернет...

noname00.pas
09-12-2002, 08:20
Roman Go
Конечно нет. Зато есть в книгах по Паскалю :-)
Объявляешь в нужном месте переменную типа "file". Из таких файлов чтение производится поблочно, открывать его нужно с дополнительным параметром - длина блока.
Пишешь "assign(F, '<путь к твоему файлу>')". Здесь F - твоя файловая переменная. Если путь к файлу заранее неизвестен, то лучше писать относительный путь, то есть путь относительно директории, в которой была запущена программа :-)
Далее чтение блока производится командой BlockRead(F, Buf, Count), F - файловая переменная, Buf - переменная, куда будет записана прочитанная информация, Count - количество блоков для считывания.

Примечание 1: Буферная переменная должна быть соответствующего размера, чтобы ничего не переполнилось.
Примечание 2: Существуют некоторые ограничения на размер блока и на количество считываемых блоков. (это посмотри в хелпе - я не помню :-) )



Добавлено:

Да, совсем забыл...
Чтобы открыть файл на чтение нужно выполнить команду
reset(F, 1)
Здесь 1 - длина блока. Кстати с блоками длины 1 работать удобнее, т.к. из них можно составить блок любой длины. :-)

Roman Go
10-12-2002, 05:35
var
*Form1: TForm1;
*i, i1:integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var f:file;
* *buf:char;

begin
* *//i:=0;
* *assignfile(f,'1.wav');
* *reset(f, 1);
* *seek(f, i);
* *BlockRead(f, buf, 1);
* *memo1.Lines.Add(buf);
* *closefile(f);
* *i:=i+1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var f:file;
* *buf:integer;
* *p:^integer;
begin
* *//i:=0;
* *assignfile(f,'1.wav');
* *reset(f, 1);
* *seek(f, i1);
* *BlockRead(f, buf, 1);
* *p:=@buf;
* *memo2.Lines.Add(inttostr(p^));
* *closefile(f);
* *i1:=i1+1;
end;


Данные то я прочитал, только вот проблема то в том, что я явно не то читаю, что мне нужно, когда читаю по символьно, то выводит непонятно что, а когда предпологаю чтение чисел у меня всегда идут, какие-то цифры, даже там где по идее должны быть буквы... то что там указатели есть, так это я подумал может там храняться указатели на нужные мне значения пытался их достать, глупость конечно... но раз уж набрал так пусть остается
[hr]
возможно я не с того конца начал, для начала я не пойму что это за формат, *http://graphics.cs.msu.su/courses/cg02b/assigns/hw-2/help/wavfmt.htm мне ничего не понятно кроме общих слов, "от начала на столько то" а вот на сколько, и как это сколько отступить не понимаю... неполучается... Что это ch, ah, h и как с ними работать...

Исправлено: Roman Go, 6:37 10-12-2002

Roman Go
17-02-2003, 06:23
 while not eof(f) do
  begin
   blockread(f,buf,sizeof(buf));
   setLength(data, length(data)+1);
   data[i]:=buf;
   inc(i);
  end;

 closefile(f);


Вот этот кусочек кода читает данные, чтение начинается сразу после индификатора data (+4 байта отведенных под размер области данных).
Читает, то он читает и даже рисунок похожий получается, но данные я читаю не те, дело в том что у меня есть программка читающая wav файлы и если я открываю один и тот же файл своей программкой и ей я получаю разные результаты.
Число каналов - 1, Число байт для представления одного отсчета - 2, разрядность - 16. Это параметры файла на котором я эксперементирую, дело в том что не один из них я не учитываю, ибо не знаю как это сделать.
Число байт для представления одного отсчета - 2
А я читаю по четыре байта, а если читаю по 2 то получаю абсолютно неправильный результат. К тому же мой код дает ровно половину от тех значений, которые записанны в файле
:help: как учесть при чтение разрядность, число байт для чтения, число каналов...


Добавлено:

Что такое полное слово? Как прочитать старший и младший байт, и вообще имеет ли это какое-либо отношение к тому что я пытаюсь сделать?

Добавлено:

Формат звуковых данных с дискретностью 16 бит выглядит аналогично. Для монофонического сигнала данные хранятся в массиве 16-битовых слов.
Один байт - 8 бит, а я таки читаю по четыре байта. :confused:
Для стерео-фонического используется массив двойных слов, причем младшему слову соот-ветствует левый канал, а старшему - правый.




© OSzone.net 2001-2012