Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 096

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Есть исходник получения массива данных инвертированного речевого сигнала. Что лучше использовать быстрое преобразование Фурье или прямое перемножение частоты, чтобы обратно инвертировать речевой сигнал?
Привожу исходник:

Ниже прилагаю исходники в архиве

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. {{code|delphi}}
  2. procedure TForm1.Button1Click(Sender: TObject);
  3. var
  4. // LPF1,LPF2:TIirLPF;
  5. header:hw;
  6. fout,fin:TFileStream;
  7. i,d,pos:cardinal;
  8. s:string;
  9. ww:Dat;
  10. a0:real;
  11. path: string;
  12. begin
  13. path:=getcurrentdir;
  14. ProgressBar1.Position := 0;
  15. FNInput :=path+'/f_i.wav';
  16. fin:=tfilestream.Create(FNInput,fmopenread);
  17. fin.Read(header, sizeof(header));
  18.  
  19. s:=copy(header.h,0,4);
  20. if s <> 'RIFF' then
  21. begin
  22. fin.Free;
  23. ShowMessage('Not wav file');
  24. exit;
  25. end;
  26.  
  27. s:=copy(header.fmt,0,7);
  28. if s <> 'WAVEfmt' then
  29. begin
  30. fin.Free;
  31. ShowMessage('Not wav file');
  32. exit;
  33. end;
  34.  
  35.  
  36. pos:=$14+header.SD;
  37. fin.Position:=pos;
  38. fin.ReadBuffer(ww,sizeof(ww));
  39. s:=lowercase(copy(ww.hh,0,4));
  40.  
  41.  
  42. while s <> 'data' do
  43. begin
  44. pos:=pos+8+ww.A;
  45. if pos > 512 then
  46. begin
  47. fin.Free;
  48. ShowMessage('No data');
  49. exit;
  50. end;
  51. fin.Position:=pos;
  52. fin.ReadBuffer(ww,sizeof(ww));
  53. s:=lowercase(copy(ww.hh,0,4));
  54. end;
  55.  
  56. fin.Position:=pos;
  57. DataSize:=(fin.Size-pos);
  58. SetLength(aData, DataSize);
  59. SetLength(bData, DataSize);
  60. fin.ReadBuffer(aData[0],DataSize);
  61. fin.Free;
  62.  
  63. SampleRate := header.hh.nSamplesPerSec;
  64.  
  65. Form1.Caption := 'Spectrum signal inverter - ' + ExtractFilEName(FNInput);
  66.  
  67. // LPF1 := TIirLPF.Create(3600, SampleRate, 0.8, 12, 0.8);
  68. // LPF2 := TIirLPF.Create(3600, SampleRate, 0.8, 12, 0.8);
  69. fout:=TFileStream.Create(FNInput+'_converted.wav',fmCreate);
  70.  
  71. d:=DataSize;
  72.  
  73. for i:=0 to d - 1 do
  74. begin
  75.  
  76. a0:=aData[i];
  77.  
  78.  
  79. bData[i]:=round(a0);
  80.  
  81. Application.ProcessMessages();
  82. Form1.ProgressBar1.Position:=round((i/d)*100);
  83. end;
  84.  
  85. header.hh.nChannels:=01;
  86. header.SD:=$10;
  87. header.SF:=d*2+36;
  88. header.hh.nSamplesPerSec:=SampleRate;
  89. header.hh.nBlockAlign:=2;
  90. header.hh.nAvgBytesPerSec:=header.hh.nSamplesPerSec;
  91. fout.Write(header,sizeof(header));
  92.  
  93.  
  94. fout.Position:=$24;
  95. header.h[0]:='d';
  96. header.h[1]:='a';
  97. header.h[2]:='t';
  98. header.h[3]:='a';
  99.  
  100. fout.Write(header.h[0],4);
  101. fout.Write(DataSize,sizeof(DataSize));
  102. fout.Write(bdata[0],DataSize);
  103.  
  104.  
  105. Form1.ProgressBar1.Position:=0;
  106. fout.Free;
  107. end;
  108. {{/code|delphi}}


Примечание #1 (18 марта 2011, 14:42):
Примеры инвертированного и, грубо говоря, (нормального, преобразованного) сигналов привожу ниже:
http://vhf-scanner.com/soft/sign.zip

Buczhack Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Buczhack (статус: Посетитель)
Вопрос отправлен: 18 марта 2011, 13:34
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 24; последнее сообщение — 19 марта 2011, 07:46; участников в обсуждении: 4.

Страницы: [1] [2] [Следующая »]

Вадим К

Вадим К (статус: Академик), 18 марта 2011, 13:41 [#1]:

А просто взять и попробовать?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 18 марта 2011, 13:43 [#2]:

А что такое "инверсия (речевого) сигнала" с точки зрения обработки данных?
Я никогда не занимался обработкой звука, однако наслышан, что для этого народ активно юзает именно БПФ. В инете полно инфы и исходников по сабжу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Buczhack

Buczhack (статус: Посетитель), 18 марта 2011, 14:07 [#3]:

Инверсия спектра, грубо говоря, переворот спектра сигнала с определенной частотой верхнего среза, простейшее закрытие речи. Но как его реализовать?
min@y™

min@y™ (статус: Доктор наук), 18 марта 2011, 14:26 [#4]:

Я ж не спрашивал тебя про спектры, частоты, срезы и т.п. Я спрашивал вот это:

Цитата (min@y™):

А что такое "инверсия (речевого) сигнала" с точки зрения обработки данных?

Это значит, что нужно абстрагироваться от узкоспециализированных понятий и поставить задачу по-другому, а именно:
1. Исходные данные - набор байт, слов, двойных слов или других вещей, которые можно выразить через единицы информации.
2. Что с этими данными сделать, чтобы на выходе была нужная информация - набор байт, слов и т.п. (см. выше).
3. Привести пример: Входные данные ХХХ, выходные YYY.

Вот, типа, как-то так.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

18 марта 2011, 14:28: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.

Buczhack

Buczhack (статус: Посетитель), 18 марта 2011, 14:33 [#5]:

Примеры инвертированного и, грубо говоря, (нормального, преобразованного) сигналов привожу ниже:
http://vhf-scanner.com/soft/sign.zip
min@y™

min@y™ (статус: Доктор наук), 18 марта 2011, 15:26 [#6]:

Цитата (Buczhack):

Примеры инвертированного и, грубо говоря, (нормального, преобразованного) сигналов привожу ниже: http://vhf-scanner.com/soft/sign.zip

Ну и чего я в этих двух файлах должен увидель? Я вижу, некоторые байты в них инвертированы (иногда частично). Что ещё можешь сказать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Buczhack

Buczhack (статус: Посетитель), 18 марта 2011, 15:30 [#7]:

В примере f_i.wav инвертированный сигнал, в примере f_r.wav деинвертированый сигнал, т.е. не некоторые байты, а весь спектр сигнала перевернут вокруг оси. Посмотрите, например, сигналы с помощью Audobe Audition или CoolEdit в режиме спектрального представления.
Buczhack

Buczhack (статус: Посетитель), 18 марта 2011, 15:36 [#8]:

По другому, берется сигнал с полосой (в примере) 3,6 Кгц и переворачивается вокруг своей оси, т.е. верхняя частота среза сигнала так и остается 3,6 Кгц (в примере она смещена вниз до 3,4 Кгц). Теоретически я понимаю как это происходит, но программно для меня это создает проблему, может мозгов не хватает, может опыта в программировании... (прошу не обижать)
min@y™

min@y™ (статус: Доктор наук), 18 марта 2011, 15:43 [#9]:

Цитата (Buczhack):

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

А у меня нет опыта работы со звуком. Ты мне скажи, какие байты проинвертировать, и я это сделаю. Не надо таких слов, как "сигнал", "полоса", "частота" и т.д. Для меня твои файлы - это ПРОСТО файлы, а в них ПРОСТО байты и НИЧЕГО БОЛЬШЕ.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Buczhack

Buczhack (статус: Посетитель), 18 марта 2011, 15:52 [#10]:

Я даже не знаю как объяснить без понятий сигнал, частота, полоса, может вот это поможет:
инверсию спектра можно достичь как минимум двумя способами, первый это путем перемножения исходного сигнала с нужной частотой и после результат проходит через ФНЧ с частотой среза равной F, сюда же относится и смена знака каждого второго отсчета на противоположный, что есть суть перемножение сигнала с частотой Fd/2, и второй, это инверсия после прямого преобразования Фурье, когда сигнал из временной облаcти переносится в частотную, и уже здесь происходит прямая перестановка частот местами, затем обратное преобразование Фурье и получение инверсного сигнала, первый способ используется при простой инверсии, второй позволяет делать гораздо более интересные вещи, поскольку позволяет менять частоты местами как душе угодно.
На выходе надо получить звуковой файл , похожий на f_r.wav (т.е. со смысловой информацией).
Death_Master

Death_Master (статус: Посетитель), 18 марта 2011, 15:58 [#11]:

Buczhack: А если попробовать по этапам разложить?
1) чтение из файла - есть
2) преобразование в волну - элементарно
3) анализ волны и преобразование в спектр - вроде были готовые алгоритмы
4) изменение спектра как нужно (вот тут нужно подумать)
5) преобразование спектра в волну
6) запись в файл
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Buczhack

Buczhack (статус: Посетитель), 18 марта 2011, 16:04 [#12]:

Вот самое интересное - 4-й пункт.
min@y™

min@y™ (статус: Доктор наук), 18 марта 2011, 16:24 [#13]:

А может разложить по этапам по-другому?
1) чтение из файла;
2) вычисление смещений нужных байтов в этом файле;
3) преобразование этих байтов (вот тут нужно подумать);
4) закрытие файла.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Buczhack

Buczhack (статус: Посетитель), 18 марта 2011, 16:25 [#14]:

Добавлю для наглядности примеры инвертированного и деинверитированного сигналов в виде спектрограммы:
исходный - http://vhf-scanner.com/images/inverse.jpg
обработанный - http://vhf-scanner.com/images/deinverted_normal.jpg
min@y™

min@y™ (статус: Доктор наук), 18 марта 2011, 16:26 [#15]:

Вон там ещё поищи, там тоже спросить можно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 18 марта 2011, 16:27 [#16]:

Цитата (Buczhack):

Добавлю для наглядности примеры инвертированного и деинверитированного сигналов в виде спектрограммы: исходный - http://vhf-scanner.com/images/inverted.jpg обработанный - http://vhf-scanner.com/images/deinverted_normal.jpg

Мне это не поможет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Buczhack

Buczhack (статус: Посетитель), 18 марта 2011, 16:30 [#17]:

Спасибо. Там уже задал вопрос, пока никто не ответил.
Death_Master

Death_Master (статус: Посетитель), 18 марта 2011, 16:31 [#18]:

по моему п.4 - нужно просто перевернуть каждый столбец таблицы частот.... в принципе не сложно
останется только преобразовать из спектра в волну
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Buczhack

Buczhack (статус: Посетитель), 18 марта 2011, 16:34 [#19]:

Да, а как это программно реализовать?
Death_Master

Death_Master (статус: Посетитель), 18 марта 2011, 16:42 [#20]:

переворот столбца? просто читать данные столбца в обратном направлении (максимум-счётчик)
Сложнее всего из спектра в волну перобразовать...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.03 сек.