EU6SM писал(а):Откуда такая уверенность, что хватит?

Времени ~800мкс между сэмплами, такт 0.1мкс. За 800 тактов точно справитесь, прямо-таки уверены (умножения и деления нет, и тактов в риале значительно менее 800)? И про свёртку несколько перегнули, не кажется? Корректнее было бы назвать метод при котором "хватит", коль скоро речь идёт о корректности
просто делал на тиньке анализатор спектра и так уж вышло, что ЦОС моя работа )
EU6SM писал(а):Кстати, о корректности: приведённые схемы надо было выбросить и забыть 20 лет назад, на кой чёрт Вы их извлекли из сундука, если разбираетесь в вопросе настолько, что в состоянии дать уверенный и компетентный коммент с учётом явно непростого решения задачи для tiny13?
оно и делалось 20 лет назад. Могу и фото рабочих экземпляров показать )
EU6SM писал(а):Перемножитель на КТ3 раньше делали от бедности, вообще-то...
распространенный стереотип среди современных электронщиков - все, что требует больше двух деталек пихать в МК. А ведь достаточно примитивной аналоговой схемы, не требующей программатора.
EU6SM писал(а):Речь идёт о решении "шахматной партии", а не декодировании любой ценой, вроде бы это очевидно. Решение интересно именно в контексте минималистики.
об чем вы, бро?

Решения как такового нет, "схема" на МК - лишь кусок тупого пластика и кремния, которое пока ничего не делает. Если есть алгоритм, плиз его в тему, будет предметное обсуждение.
EU6SM писал(а):Исходники? Если не сложно, чиркните ссылку на исходники programmist'а
...
А там точно FFT?
странно, что никто тут не знает про файловый архив данного ресурса. Нет, в той ранней версии точно не FFT, простое перемножение каждого второго отсчета (кстати, ниже) как тут уже написали. Но позже появилась версия с переворотом спектра через Фурье.
Обсуждение
http://www.radioscanner.ru/forum/topic14758.html
Сам частотный инвертор в 12 году был по ссылке
http://www.radioscanner.ru/files/downlo ... vertor.rar, сейчас переместили, куда, не в курсе. Искать мне лень, поэтому то, что сохранилось с прямой работой с PCM:
Код: Выделить всё
var
i,j,k,FSize : Longint;
fn,ext : string;
SrcFile, DestFile : File;
BytesRead, BytesWritten : Longint;
Buffer16 : array [0..BufferLength*2] of Byte;
AudioArray16 : array [0..BufferLength] of SmallInt; //-32768..32767
waveheader : TWaveHeader;
dataheader : TDataHeader;
Channels : SmallInt;
begin
Label1.Caption:= '';
LabelCh.Caption:= '';
LabelFrq.Caption:= '';
if OpenDialog1.Execute then fn:= OpenDialog1.filename;
if fn = '' then exit;
//декодировка MP3-
ext:= lowercase(ExtractFileExt(fn));
if ext='.mp3' then begin
shellexecute(0,
'open',
'lame\lame.exe',
pchar('--decode '+ fn),
pchar(extractfilepath(application.ExeName)),
SW_HIDE);
application.ProcessMessages;
i:= GetTickCount; while gettickcount-i<2000 do;
fn:= extractfilepath(fn) + extractfilename(fn)+'.wav'
end;
fnn:= MainDir + '\Inverted_' + ExtractFileName(fn);
AssignFile(SrcFile, fn);
AssignFile(DestFile, fnn);
Reset(SrcFile, 1);
try
Rewrite(DestFile, 1);
BlockRead(SrcFile, waveheader, sizeof(twaveheader), BytesRead);
with waveheader do
begin
if idriff <> 'RIFF' then raise ereaderror.create('wrong idriff');
if idwave <> 'WAVE' then raise ereaderror.create('wrong idwave');
if idfmt <> 'fmt ' then raise ereaderror.create('wrong idfmt');
if wavetype <> 1 then raise ereaderror.create('unknown format');
if bits <> 16 then raise ereaderror.create('wrong format');
LabelCh.Caption:= 'Каналы : ' + IntToStr(ch);
LabelFrq.Caption:= 'Дискрет : ' + IntToStr(freq);
Channels:= ch;
end;
BlockWrite(DestFile, waveheader, sizeof(twaveheader), BytesWritten);
BlockRead(SrcFile, dataheader, sizeof(tdataheader), BytesRead);
BlockWrite(DestFile, dataheader, sizeof(tdataheader), BytesWritten);
try
SBOpen.Enabled:= False;
try
FSize := FileSize(SrcFile);
prbCopy.Max:= FSize;
repeat
BlockRead(SrcFile, Buffer16, BufferLength*2, BytesRead);
if BytesRead > 0 then
begin
CopyMemory(@AudioArray16, @Buffer16, BytesRead);
j:=0; k:=0;
for i := 0 to BytesRead div 2 do
begin
if Channels = 1 then if i and 1 = 0 then AudioArray16[i]:= -AudioArray16[i];
if Channels = 2 then
begin
if i and 1 = 0 then
begin
if j and 1 = 0 then AudioArray16[i]:= -AudioArray16[i];
Inc(j);
end else
begin
if k and 1 = 0 then AudioArray16[i]:= -AudioArray16[i];
Inc(k);
end;
end;
end;
CopyMemory(@Buffer16, @AudioArray16, BytesRead);
Application.ProcessMessages;
BlockWrite(DestFile, Buffer16, BytesRead, BytesWritten);
if BytesRead <> BytesWritten then
raise Exception.Create('Error copying file')
else prbCopy.Position := prbCopy.Position + BytesWritten;
end
until BytesRead = 0;
except
Erase(DestFile);
raise;
end;
finally
CloseFile(DestFile);
prbCopy.Position:=0;
end;
finally
CloseFile(SrcFile);
SBOpen.Enabled:= True;
end;
Label1.Caption:= 'Готово.';
end;
Сей код (вся суть которого сводится к одной строчке " for i := 0 to BytesRead div 2 do
if i and 1 = 0 then AudioArray16
:= -AudioArray16;") не требователен к ресурсам и вполне может работать реалтайм.
Берем кусок речи:

Вот что делает данный код после преобразования:

Теперь сформируем тестовый 400 Гц тон:

После инверсии:

Исходники проекта данного инвертора оффтайм: https://yadi.sk/d/jAuJf75JrYfEe
Еще одна оффтайм-утилита https://yadi.sk/d/0vN0dqghrYfJz
EU6SM писал(а): софтина проводит в реальном времени?
следующая софтина - Voice Descrambler, да, realtime https://yadi.sk/d/RkmNGsfXrYfN3
Всех с днем Радио )