| 
| 
 | Вопрос # 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |