|
Вопрос # 5 096/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
Есть исходник получения массива данных инвертированного речевого сигнала. Что лучше использовать быстрое преобразование Фурье или прямое перемножение частоты, чтобы обратно инвертировать речевой сигнал?
Привожу исходник:
Ниже прилагаю исходники в архиве
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- {{code|delphi}}
- procedure TForm1.Button1Click(Sender: TObject);
- var
- // LPF1,LPF2:TIirLPF;
- header:hw;
- fout,fin:TFileStream;
- i,d,pos:cardinal;
- s:string;
- ww:Dat;
- a0:real;
- path: string;
- begin
- path:=getcurrentdir;
- ProgressBar1.Position := 0;
- FNInput :=path+'/f_i.wav';
- fin:=tfilestream.Create(FNInput,fmopenread);
- fin.Read(header, sizeof(header));
-
- s:=copy(header.h,0,4);
- if s <> 'RIFF' then
- begin
- fin.Free;
- ShowMessage('Not wav file');
- exit;
- end;
-
- s:=copy(header.fmt,0,7);
- if s <> 'WAVEfmt' then
- begin
- fin.Free;
- ShowMessage('Not wav file');
- exit;
- end;
-
-
- pos:=$14+header.SD;
- fin.Position:=pos;
- fin.ReadBuffer(ww,sizeof(ww));
- s:=lowercase(copy(ww.hh,0,4));
-
-
- while s <> 'data' do
- begin
- pos:=pos+8+ww.A;
- if pos > 512 then
- begin
- fin.Free;
- ShowMessage('No data');
- exit;
- end;
- fin.Position:=pos;
- fin.ReadBuffer(ww,sizeof(ww));
- s:=lowercase(copy(ww.hh,0,4));
- end;
-
- fin.Position:=pos;
- DataSize:=(fin.Size-pos);
- SetLength(aData, DataSize);
- SetLength(bData, DataSize);
- fin.ReadBuffer(aData[0],DataSize);
- fin.Free;
-
- SampleRate := header.hh.nSamplesPerSec;
-
- Form1.Caption := 'Spectrum signal inverter - ' + ExtractFilEName(FNInput);
-
- // LPF1 := TIirLPF.Create(3600, SampleRate, 0.8, 12, 0.8);
- // LPF2 := TIirLPF.Create(3600, SampleRate, 0.8, 12, 0.8);
- fout:=TFileStream.Create(FNInput+'_converted.wav',fmCreate);
-
- d:=DataSize;
-
- for i:=0 to d - 1 do
- begin
-
- a0:=aData[i];
-
-
- bData[i]:=round(a0);
-
- Application.ProcessMessages();
- Form1.ProgressBar1.Position:=round((i/d)*100);
- end;
-
- header.hh.nChannels:=01;
- header.SD:=$10;
- header.SF:=d*2+36;
- header.hh.nSamplesPerSec:=SampleRate;
- header.hh.nBlockAlign:=2;
- header.hh.nAvgBytesPerSec:=header.hh.nSamplesPerSec;
- fout.Write(header,sizeof(header));
-
-
- fout.Position:=$24;
- header.h[0]:='d';
- header.h[1]:='a';
- header.h[2]:='t';
- header.h[3]:='a';
-
- fout.Write(header.h[0],4);
- fout.Write(DataSize,sizeof(DataSize));
- fout.Write(bdata[0],DataSize);
-
-
- Form1.ProgressBar1.Position:=0;
- fout.Free;
- end;
- {{/code|delphi}}
Примечание #1 (18 марта 2011, 14:42):
 |
Вопрос задал: Buczhack (статус: Посетитель)
Вопрос отправлен: 18 марта 2011, 13:34
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 24; последнее сообщение — 19 марта 2011, 07:46; участников в обсуждении: 4.
Страницы: [1] [2] [Следующая »]
|
Вадим К (статус: Академик), 18 марта 2011, 13:41 [#1]:
А просто взять и попробовать?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 18 марта 2011, 13:43 [#2]:
А что такое "инверсия (речевого) сигнала" с точки зрения обработки данных?
Я никогда не занимался обработкой звука, однако наслышан, что для этого народ активно юзает именно БПФ. В инете полно инфы и исходников по сабжу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Buczhack (статус: Посетитель), 18 марта 2011, 14:07 [#3]:
Инверсия спектра, грубо говоря, переворот спектра сигнала с определенной частотой верхнего среза, простейшее закрытие речи. Но как его реализовать?
|
|
min@y™ (статус: Доктор наук), 18 марта 2011, 14:26 [#4]:
Я ж не спрашивал тебя про спектры, частоты, срезы и т.п. Я спрашивал вот это:
Цитата (min@y™):
А что такое "инверсия (речевого) сигнала" с точки зрения обработки данных?
Это значит, что нужно абстрагироваться от узкоспециализированных понятий и поставить задачу по-другому, а именно:
1. Исходные данные - набор байт, слов, двойных слов или других вещей, которые можно выразить через единицы информации.
2. Что с этими данными сделать, чтобы на выходе была нужная информация - набор байт, слов и т.п. (см. выше).
3. Привести пример: Входные данные ХХХ, выходные YYY.
Вот, типа, как-то так.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
18 марта 2011, 14:28: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.
|
min@y™ (статус: Доктор наук), 18 марта 2011, 15:26 [#6]:
Цитата (Buczhack):
Примеры инвертированного и, грубо говоря, (нормального, преобразованного) сигналов привожу ниже: http://vhf-scanner.com/soft/sign.zip
Ну и чего я в этих двух файлах должен увидель? Я вижу, некоторые байты в них инвертированы (иногда частично). Что ещё можешь сказать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Buczhack (статус: Посетитель), 18 марта 2011, 15:30 [#7]:
В примере f_i.wav инвертированный сигнал, в примере f_r.wav деинвертированый сигнал, т.е. не некоторые байты, а весь спектр сигнала перевернут вокруг оси. Посмотрите, например, сигналы с помощью Audobe Audition или CoolEdit в режиме спектрального представления.
|
|
Buczhack (статус: Посетитель), 18 марта 2011, 15:36 [#8]:
По другому, берется сигнал с полосой (в примере) 3,6 Кгц и переворачивается вокруг своей оси, т.е. верхняя частота среза сигнала так и остается 3,6 Кгц (в примере она смещена вниз до 3,4 Кгц). Теоретически я понимаю как это происходит, но программно для меня это создает проблему, может мозгов не хватает, может опыта в программировании... (прошу не обижать)
|
|
min@y™ (статус: Доктор наук), 18 марта 2011, 15:43 [#9]:
Цитата (Buczhack):
Теоретически я понимаю как это происходит, но программно для меня это создает проблему, может мозгов не хватает, может опыта в программировании... (прошу не обижать)
А у меня нет опыта работы со звуком. Ты мне скажи, какие байты проинвертировать, и я это сделаю. Не надо таких слов, как "сигнал", "полоса", "частота" и т.д. Для меня твои файлы - это ПРОСТО файлы, а в них ПРОСТО байты и НИЧЕГО БОЛЬШЕ.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Buczhack (статус: Посетитель), 18 марта 2011, 15:52 [#10]:
Я даже не знаю как объяснить без понятий сигнал, частота, полоса, может вот это поможет:
инверсию спектра можно достичь как минимум двумя способами, первый это путем перемножения исходного сигнала с нужной частотой и после результат проходит через ФНЧ с частотой среза равной F, сюда же относится и смена знака каждого второго отсчета на противоположный, что есть суть перемножение сигнала с частотой Fd/2, и второй, это инверсия после прямого преобразования Фурье, когда сигнал из временной облаcти переносится в частотную, и уже здесь происходит прямая перестановка частот местами, затем обратное преобразование Фурье и получение инверсного сигнала, первый способ используется при простой инверсии, второй позволяет делать гораздо более интересные вещи, поскольку позволяет менять частоты местами как душе угодно.
На выходе надо получить звуковой файл , похожий на f_r.wav (т.е. со смысловой информацией).
|
|
Death_Master (статус: Посетитель), 18 марта 2011, 15:58 [#11]:
Buczhack: А если попробовать по этапам разложить?
1) чтение из файла - есть
2) преобразование в волну - элементарно
3) анализ волны и преобразование в спектр - вроде были готовые алгоритмы
4) изменение спектра как нужно (вот тут нужно подумать)
5) преобразование спектра в волну
6) запись в файл
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Buczhack (статус: Посетитель), 18 марта 2011, 16:04 [#12]:
Вот самое интересное - 4-й пункт.
|
|
min@y™ (статус: Доктор наук), 18 марта 2011, 16:24 [#13]:
А может разложить по этапам по-другому?
1) чтение из файла;
2) вычисление смещений нужных байтов в этом файле;
3) преобразование этих байтов (вот тут нужно подумать);
4) закрытие файла.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 18 марта 2011, 16:26 [#15]:
Вон там ещё поищи, там тоже спросить можно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Buczhack (статус: Посетитель), 18 марта 2011, 16:30 [#17]:
Спасибо. Там уже задал вопрос, пока никто не ответил.
|
|
Death_Master (статус: Посетитель), 18 марта 2011, 16:31 [#18]:
по моему п.4 - нужно просто перевернуть каждый столбец таблицы частот.... в принципе не сложно
останется только преобразовать из спектра в волну
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Buczhack (статус: Посетитель), 18 марта 2011, 16:34 [#19]:
Да, а как это программно реализовать?
|
|
Death_Master (статус: Посетитель), 18 марта 2011, 16:42 [#20]:
переворот столбца? просто читать данные столбца в обратном направлении (максимум-счётчик)
Сложнее всего из спектра в волну перобразовать...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|