|
Вопрос # 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]
|
Buczhack (статус: Посетитель), 18 марта 2011, 16:53 [#21]:
Я так понимаю, запись получится задом-наперед, а не инверсия.
|
|
Вадим К (статус: Академик), 18 марта 2011, 17:21 [#22]:
Цитата (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 (статус: Посетитель), 19 марта 2011, 07:46 [#24]:
На другом форуме посоветовали просто умножить каждую четную или нечетную выборку на -1. Попробовал, получилось. Но возникла проблема со смещением, сигнал надо сместить на 400 Гц по спектру вниз.
Считаю вопрос по инверсии закрытым.
|
19 марта 2011, 14:18: Статус вопроса изменён на решённый (изменил автор вопроса — Buczhack)
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|