Экспертная система 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]

Buczhack

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

Я так понимаю, запись получится задом-наперед, а не инверсия.
Вадим К

Вадим К (статус: Академик), 18 марта 2011, 17:21 [#22]:

Цитата (Death_Master):

Сложнее всего из спектра в волну перобразовать...

Обратное фурье преобразование:)
Галочка "подтверждения прочтения" - вселенское зло.
Death_Master

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

Buczhack: не так... приведу пример(упрощённыйб 3х3):
исходный спектр:
20 00 30
40 20 50
60 10 00
изменённый спектр:
60 10 00
40 20 50
20 00 30
если бы задом на перёд:
30 00 20
50 20 40
00 10 60
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Buczhack

Buczhack (статус: Посетитель), 19 марта 2011, 07:46 [#24]:

На другом форуме посоветовали просто умножить каждую четную или нечетную выборку на -1. Попробовал, получилось. Но возникла проблема со смещением, сигнал надо сместить на 400 Гц по спектру вниз.
Считаю вопрос по инверсии закрытым.

19 марта 2011, 14:18: Статус вопроса изменён на решённый (изменил автор вопроса — Buczhack)

Страницы: [« Предыдущая] [1] [2]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 22:27
Выполнено за 0.02 сек.