Перейти к содержанию
    

Хочу сделать гитарный процессор

длинна ИХ связана с "самым" НЧ компонентом... И зачем то перекрытие? Перекрытие для частотного разрешения делают(компромисс - окно/искажения) - здесь оно не к месту (и так много искажений). FFT там будет длинной 1536. Задержка будет такая же как и в FIR.

 

Гильберт это фильтр, хотим быстро делаем этот фильтр через быструю свёртку на основе FFT, а вот зануление частот это вообще что такое? Кто это придумал, в какой книжке описано? Дайте теоретическое обоснование этой операции, какие искажения она даёт? Типа ухо терпит и так сойдёт?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

petrov:

а вот зануление частот это вообще что такое? Кто это придумал, в какой книжке описано? Дайте теоретическое обоснование этой операции, какие искажения она даёт? Типа ухо терпит и так сойдёт?

 

Дык, аналитический сигнал равен 0 в области отрицательных частот. Отсюда и обнуление компонет дпф для отрицательных частот. Про сто друид как обычно забил на тонкости...

 

ps

Кстати, в матлабе функция hilbert реализована именно через бпф с обнулением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык, аналитический сигнал равен 0 в области отрицательных частот. Отсюда и обнуление компонет дпф для отрицательных частот. Про сто друид как обычно забил на тонкости...

 

Так берём фильтр и обнуляем, нет? От чего же Рабинеры с Голдами про быструю свёртку толкуют, а про такой красивый народный способ молчок?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по памяти:

- первый фактор, что не просто занулив, а перемножив со спектром ИХ, так как не просто гильберт, а полосовой фильтр комплексный, сразу и убирает отрицательные частоты, и полосу вырезает нужную.

раз всё равно считать фурье для искажения спектра, почему бы не заменить длиную свертку во временной области (с 1536 тактами на отчёт) на просто умножение на характеристику фильтра в частотной области с грубо говоря 1 тактом на отсчёт и 30 тактами на само ФФТ, которое всё равно делать потом придётся.

- второй фактор, что при использовании разрядностей ффт, которые удачно ложатся на 5501, укладываясь в ограничения по размеру кода из-за его маленького ОЗУ, получается лучше по шумам во временной считать.

- третий фактор, вообще ограничения по кол-ву ОЗУ под код и данные у 5501.

для звука, тем более просто голоса, в каком именно месте 16 разрядов не хватило? да и такой длинный КИХ по памяти тоже не мало получается.

а внутренней памяти действительно не особо много.

- четвертый фактор - при длине ИХ 1536, и запасом на перекрытие, размер ФФТ очень немаленький получается, и получается бОльшая, уже запредельная по ТЗ задержка сигнала от входа до выхода.

так вроде, как уж отметили, длина ффт связана только с самой низкой частотой/разрешением. на 16кГц и длине 1024 это 16Гц и 62мс задержки, плюс время на посчитать

задержка на 1536 КИХ, если их два вроде поболее будет.

в общем "не лезет в крынку"

да я не с целью подъебнуть, а хочется разобраться и понять.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гильберт это фильтр, хотим быстро делаем этот фильтр через быструю свёртку на основе FFT, а вот зануление частот это вообще что такое? Кто это придумал, в какой книжке описано? Дайте теоретическое обоснование этой операции, какие искажения она даёт? Типа ухо терпит и так сойдёт?

:biggrin: Это Вы меня спрашиваете? Где я их занулил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:biggrin: Это Вы меня спрашиваете? Где я их занулил?

 

Вы предлагаете вместо фильтров использовать манипуляции с FFT?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

petrov:

Так берём фильтр и обнуляем, нет? От чего же Рабинеры с Голдами про быструю свёртку толкуют, а про такой красивый народный способ молчок?

 

 

Если 1 словом - да.

Если подробнее:

 

function s=mhilbert(x,f1,f2,Fd,BLOCK_SIZE,FFT_SIZE);


N=length(x);
w=kaiser(FFT_SIZE/2+1,6*pi);
m=sqrt(sum(triu(repmat(w,1,FFT_SIZE/2)))/sum(w));
win=sqrt(2)*sqrt(BLOCK_SIZE/FFT_SIZE)*[m m(end:-1:1)];

%Filter calculation
h=zeros(1,FFT_SIZE);
f1=floor(f1*FFT_SIZE/Fd)+1;
f2=floor(f2*FFT_SIZE/Fd)+1;
h(f1:f2)=2;
s=[];
amem=zeros(FFT_SIZE,1);
smem=zeros(1,FFT_SIZE);
for i=1:BLOCK_SIZE:N-mod(N,BLOCK_SIZE)
    amem(1:FFT_SIZE-BLOCK_SIZE)=amem(BLOCK_SIZE+1:FFT_SIZE);
    amem(FFT_SIZE-BLOCK_SIZE+1:FFT_SIZE)=x(i:i+BLOCK_SIZE-1);
    ssp=fft(amem.*win.');
    sp=ssp.*h.';
    smem(1:FFT_SIZE-BLOCK_SIZE)=smem(BLOCK_SIZE+1:FFT_SIZE);
    smem(FFT_SIZE-BLOCK_SIZE+1:end)=0;
    smem=smem+ifft(sp.').*win;
    s=[s smem(1:BLOCK_SIZE)];
end;

return;

 

Ну и как там у товарища? 20...7800?

y=mhilbert([1 zeros(1,10000)],20,7800,16000,128,1024);

plot(0:8000/20000:16000-8000/20000,20*log10(abs(freqz((y),1,40000,'whole'))))

grid on

 

Всяко проще, чем 1536 маков/отсчет...

 

ps

рабинеры с голдами рулят невероятно...

Изменено пользователем thermit

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы предлагаете вместо фильтров использовать манипуляции с FFT?

Ну... Даже не знаю :rolleyes: ... А што в этом такого? Тем более товарищу не хватает ресурсов. Вот только что я конкретно предложил обнулить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

_pv,

Для искажения спектра считать фурье не надо. Там другие методы. Один из них - например разложить методом линейного предсказания сигнал на фильтр и его возбуждение, затем изменить параметры фильтра и синтезировать сигнал заново. Хороший метод, но дюже шумный. Другой метод - хитрая интерполяция на трех круговых линиях задержки, где входной и выходной указатели перемещаются с разными скоростями, а длины линий задержек меняются в зависимости от текущей частоты основного тона голоса. Есть еще пара методов интересных, и во временной области опять. А вот через фурье ничего интересного не придумалось, все как правило упиралось в соединение в единое целое соседних окон без разрыва в фазах во всех компонентах после нелинейного преобразования, причем с регулируемымими параметрами преобразования, поэтому само преобразование после долгих теоретических изысканий и моделирований осталось во временной области.

 

Теперь вот что для свертки в частотной области. Для фильтрации 1536-го порядка - ближайшая длина БПФ, которая является степенью двойки - 2048. Значит сворачиваем 2048 выборок сигнала с 1536 выборок ИХ. (Или делаем БПФ с извратом длиной 1536?) Ну и соответственно сложение с перекрытием на 1535-ой выборке. Затем обратное фурье, затем собственно сам алгоритм, затем опять фурье, затем опять перемножение комплексное (второй фильтр, обрезающий все, что повылезало за пределы полосы в основном алгоритме), затем опять обратное фурье. Даже если все расчеты делаются мгновенно, то задержка тут 2048 выборок (лишняя, не считая самого алгоритма). КИХ имеет задержку в полдлины, так как их там два, то остается задержка в 1536 выборок. Это уже меньше, чем 2048 через БПФ. Плюс теперь вспомним, что если делаем блочно - еще надо посчитать блок. Соответственно задержка будет 2048 выборок - накопление буфера, потом расчет, пусть 1200-1500 выборок по времени, соответственно надо иметь входные и выходные очереди, с запасом перекрывающие это время, а это значит что еще пусть 1500 выборок в задержку в этих очередях. Итого задержка от входа на выход 3500-3600 выборок. А при работе во временнОй области - (2*1536/2)+(2*128) (входная и выходная очереди по 128 выборок) - итого задержка 1729 выборки. Разница налицо.

И ресурсы по памяти соответственно... Очереди, блоки.

 

Где 16 бит не хватило? Да в 16 битах просто невозможно реализовать только этот пре- и пост-фильтры, чтобы они, будучи отквантованными, соответствовали ТЗ по ширине переходных полос и ослаблению в полосе задерживания. Да и голос тут - это вам не телефония, где и без доп обработки с разборчивостью напряженка, и всем это пофиг :), тут должно быть так, что голос совершенно не узнаваем (на 100%), и при этом чтобы слушатель, который не в курсе, что с голосом делается, не догадался, что голос был преобразован.

 

Ну и как там у товарища? 20...7800?

Не надо гадать на кофейной гуще. Все равно всех необходимых параметров, которые надо соблюсть, я не расскажу. Иначе меня, ну это.... кирдык в общем. Если минимальная длина ИХ фильтра 1536 - значит 1536, и меньше никак.

Изменено пользователем SAURIS GmbH

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SAURIS GmbH:

А вот через фурье ничего интересного не придумалось, все как правило упиралось в соединение в единое целое соседних окон без разрыва в фазах во всех компонентах после нелинейного преобразования, причем с регулируемымими параметрами преобразования, поэтому само преобразование после долгих теоретических изысканий и моделирований осталось во временной области.

 

Дык, все уже придумано до нас. Надо было книжки читать. Все и даже больше, чем все, что можно сделать во времени, в частотной области можно сделать.

 

Не надо гадать на кофейной гуще.

 

Я вас процитировал. Чего тут гадать...

 

Все равно всех необходимых параметров, которые надо соблюсть, я не расскажу. Иначе меня, ну это.... кирдык в общем.

 

Ну кто бы сомневался. Тока за одни 1536 и 60 дб можно выговор с занесением в грудную клетку заработать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Останавливали ли Вы, уважаемый ТС, свой взор на

TLV320AIC23+STM32F405RG?

Чуть добавлю.

Запараллелив входы и просумировав выходы на хорошем ОУ (крутится в голове вроде OP27GP, но не он) - получаете 192кГц выборку.

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь вот что для свертки в частотной области. Для фильтрации 1536-го порядка - ближайшая длина БПФ, которая является степенью двойки - 2048. Значит сворачиваем 2048 выборок сигнала с 1536 выборок ИХ. (Или делаем БПФ с извратом длиной 1536?)

Мы так и не поняли почему 1536. Но даже если так то это 512*3, не ахти как сложно сделать такое БПФ.

 

Ну и соответственно сложение с перекрытием на 1535-ой выборке.

??????????????????

 

Затем обратное фурье, затем собственно сам алгоритм, затем опять фурье, затем опять перемножение комплексное (второй фильтр, обрезающий все, что повылезало за пределы полосы в основном алгоритме),

Зачем еще комплексное умножение? Перевести в действительные сигнал? В RealFFT оно уже входит в программу. Что там и как может вылезти непонятно вообще.

 

затем опять обратное фурье. Даже если все расчеты делаются мгновенно, то задержка тут 2048 выборок (лишняя, не считая самого алгоритма). КИХ имеет задержку в полдлины, так как их там два, то остается задержка в 1536 выборок.

Лабуда... После FFT будет та же задержка.

 

Это уже меньше, чем 2048 через БПФ. Плюс теперь вспомним, что если делаем блочно - еще надо посчитать блок. Соответственно задержка будет 2048 выборок - накопление буфера, потом расчет, пусть 1200-1500 выборок по времени, соответственно надо иметь входные и выходные очереди, с запасом перекрывающие это время, а это значит что еще пусть 1500 выборок в задержку в этих очередях. Итого задержка от входа на выход 3500-3600 выборок. А при работе во временнОй области - (2*1536/2)+(2*128) (входная и выходная очереди по 128 выборок) - итого задержка 1729 выборки. Разница налицо.

Ну буферов хватит 2. Один наполняем, над вторым FFT. Но если очень нужно то и одного хватит. Вообще непонятно, что они у Вас буферизуют. И не понял как там у Вас все организовано(это ОС какая-то?), но даже если так - пусть во входной прибывает и "выдавливает" из 1536, только все "выдавило" бац и FFT. Буферы вообще что-бы DMA писала в свой буфер а основная задача работала со своим, ну и и что-бы функцию на каждый сэмпл не вызывать. С одним буфером будет кривовато, но так разгрузит по МИПСам, что хуже не станет.

 

Где 16 бит не хватило? Да в 16 битах просто невозможно реализовать только этот пре- и пост-фильтры, чтобы они, будучи отквантованными, соответствовали ТЗ по ширине переходных полос и ослаблению в полосе задерживания. Да и голос тут - это вам не телефония, где и без доп обработки с разборчивостью напряженка, и всем это пофиг :), тут должно быть так, что голос совершенно не узнаваем (на 100%), и при этом чтобы слушатель, который не в курсе, что с голосом делается, не догадался, что голос был преобразован.

...да, 32 нужно...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все и даже больше, чем все, что можно сделать во времени, в частотной области можно сделать.

 

Можно. Только когда это выливается в монстров, не влезающих в имеющиеся ресурсы по памяти, то не нужно. Ни одного решения, как соединить соседние блоки без разрывов фаз после требуемого преобразования, и при этом уложиться в имеющийся ресурс, которого в 5501 почти нету, у меня не нашлось. Конечно же я не говорю и не говорил, что его безоговорочно нету.

 

А -60 дБ, да будет вам известно, где-то 2 из 10-ти экспертов-слухачей вылавливают в сигнале, как "кажется, что там что-то есть в фоне, чего нет в исходном". А это уже недопустимо. Надо чтобы все 20 из 20-ти сказали, что никаких артефактов нет. Поэтому, реально, там подавление даже больше, чем 60, цифра выбиралась именно прослушиванием до тех пор, пока всех не устроила, и после чего была зафиксирована в ТЗ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если 1 словом - да.

Если подробнее:

 

function s=mhilbert(x,f1,f2,Fd,BLOCK_SIZE,FFT_SIZE);


N=length(x);
w=kaiser(FFT_SIZE/2+1,6*pi);
m=sqrt(sum(triu(repmat(w,1,FFT_SIZE/2)))/sum(w));
win=sqrt(2)*sqrt(BLOCK_SIZE/FFT_SIZE)*[m m(end:-1:1)];

%Filter calculation
h=zeros(1,FFT_SIZE);
f1=floor(f1*FFT_SIZE/Fd)+1;
f2=floor(f2*FFT_SIZE/Fd)+1;
h(f1:f2)=2;
s=[];
amem=zeros(FFT_SIZE,1);
smem=zeros(1,FFT_SIZE);
for i=1:BLOCK_SIZE:N-mod(N,BLOCK_SIZE)
    amem(1:FFT_SIZE-BLOCK_SIZE)=amem(BLOCK_SIZE+1:FFT_SIZE);
    amem(FFT_SIZE-BLOCK_SIZE+1:FFT_SIZE)=x(i:i+BLOCK_SIZE-1);
    ssp=fft(amem.*win.');
    sp=ssp.*h.';
    smem(1:FFT_SIZE-BLOCK_SIZE)=smem(BLOCK_SIZE+1:FFT_SIZE);
    smem(FFT_SIZE-BLOCK_SIZE+1:end)=0;
    smem=smem+ifft(sp.').*win;
    s=[s smem(1:BLOCK_SIZE)];
end;

return;

 

Ну и как там у товарища? 20...7800?

y=mhilbert([1 zeros(1,10000)],20,7800,16000,128,1024);

plot(0:8000/20000:16000-8000/20000,20*log10(abs(freqz((y),1,40000,'whole'))))

grid on

 

Всяко проще, чем 1536 маков/отсчет...

 

Только это не LTI ситема, строго фильтром не является, так что будьте добры ещё график спектральных наложений, чтобы люди не от балды перекрытие выбирали, а количественно искажения контролировали.

 

Да и проигрывает это быстрой свёртке чудовищно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лабуда... После FFT будет та же задержка.

 

Это групповая фильтра та же, которая будет считаться относительно начала буфера с сигналом.

 

А физически по времени, если убрать вообще входные-выходные буфера, чтобы сигнал появился на выходе при работе через ФФТ, надо дождаться, пока наберется блок полной длины, так как обсчитывается он единовременно весь. А для КИХ во временнОй области - достаточно набрать количество выборок на пол-длины КИХ в его ЛЗ. Разница в том, что в частотной области надо набрать целый блок, после чего только его обработав, начать выдавать. А во временнОй - на каждуй входную выборку следует выходная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...