Трансиверы, передатчики, РПУ > Software Defined Radio (SDR)
Авто нотч
ra0ahc:
Пока я не совсем понимаю как оно работает.
void arm_lms_norm_init_f32 ( arm_lms_norm_instance_f32 * S ,
uint16_t numTaps ,
float32_t * pCoeffs ,
float32_t * pState ,
float32_t му ,
uint32_t размер блока
)
Параметры
[в] S указывает на экземпляр структуры фильтра LMS с плавающей запятой
[в] numTaps количество коэффициентов фильтра
[в] pCoeffs указывает на буфер коэффициентов
[в] pState указывает на буфер состояния
[в] му размер шага, который управляет обновлениями коэффициентов фильтра
[в] размер блока количество образцов для обработки
Возврат
никто
Детали
pCoeffs указывает на массив коэффициентов фильтра, хранящихся в обратном во времени порядке:
{b [numTaps-1], b [numTaps-2], b [N-2], ..., b [1], b [0]}
Начальные коэффициенты фильтра служат отправной точкой для адаптивного фильтра. pStateуказывает на массив numTaps+blockSize-1выборок длины , где blockSize- количество входных выборок, обработанных каждым вызовом arm_lms_norm_f32().
void arm_lms_norm_f32 ( arm_lms_norm_instance_f32 * S ,
const float32_t * pSrc ,
float32_t * pRef ,
float32_t * pOut ,
float32_t * pErr ,
uint32_t размер блока
)
Параметры
[в] S указывает на экземпляр структуры нормализованного фильтра LMS с плавающей запятой
[в] pSrc указывает на блок входных данных
[в] pRef указывает на блок справочных данных
[вне] pOut указывает на блок выходных данных
[вне] pErr указывает на блок данных об ошибке
[в] размер блока количество образцов для обработки
Relayer:
--- Цитата: ra0ahc от Октябрь 11, 2020, 09:16:08 pm ---А что в качестве референса использовать? Шум белый?
--- Конец цитаты ---
Нет никакого референса. Рассматривайте LMS как простой линейный предсказатель невысокого порядка. Даете ему на вход синус плюс чегото там еще - он адаптируется к самому простому сигналу - синусу. Вычитаете - остается все остальное (шум, речь и тп)
Relayer:
Вот код для LMS. Семплрейт 24к. Параметры: Order=25, Delay=20, Leakage=1E-5, AdaptationRate=0.002
Может использоваться как шумодв если FMode = fmDeNoise, но хреново и надо другие параметры. С параметрами которые я написал хорошо работает как автонотч. В случае другого семплрейт параметры возможно придется менять. order так точно можно будет уменьшить
--- Код: ---procedure TDSPLMSFilter.ApplyFilter(bf: TBuffer);
var px: PFloat32;
i,j,idl,sz,mask,dl: integer;
sum,sum_sq,df: double;
begin
dl:=Delay;
mask:=Length(DelayLine)-1;
df:=1-Leakage*AdaptationRate;
bf_Write(bf);
px:=bf_Data(bf);
sz:=Length(taps)-1;
idl:=idelay;
for j:=1 to bf.Size do begin
DelayLine[idl]:=px^;
DelayLineSqr[idl]:=px^*px^;
sum:=0; sum_sq:=0;
for i:=0 to sz do begin
sum:=sum+DelayLine[(idl+i+1+dl) and mask]*taps[i];
sum_sq:=sum_sq+DelayLineSqr[(idl+i+1+dl) and mask];
end;
if FMode = fmDeNoise then begin
px^:=sum;
sum:=DelayLine[idl]-sum;
end else begin
sum:=DelayLine[idl]-sum;
px^:=sum;
end;
// LMS update
sum:=sum*AdaptationRate/(sum_sq+1E-10);
for i:=0 to sz do
taps[i]:=taps[i]*df+sum*DelayLine[(idl+i+1+dl) and mask];
//
Inc(px);
idl:=(idl-1) and mask;
end;
idelay:=idl;
end;
function TDSPLMSFilter.Redesign(SampleRate: integer; var DelayLen: integer): Boolean;
begin
taps:=nil;
Result:=False;
if Order > 0 then begin
SetLength(taps,Order);
FillChar(taps[0],Length(taps)*SizeOf(TFloat32),0);
DelayLen:=Order+Delay+10{Gap};
SetLength(DelayLineSqr,RoundToPower2(DelayLen)*2);
FillChar(DelayLineSqr[0],Length(DelayLineSqr)*SizeOf(TFloat32),0);
Result:=True;
end;
end;
--- Конец кода ---
Relayer:
Млин, можно как-то запретить форматирование? Этож ппц какой-то - съедает квадратные скобки с индексами. Что за форумный движок такой кривой?!?!?
zenit:
--- Цитата: Relayer от Октябрь 11, 2020, 10:08:02 pm ---Млин, можно как-то запретить форматирование?
--- Конец цитаты ---
Попробуйте вставлять текст как код.
--- Код: ---вот так для примера- смайлики в игноре :) ;) :D
--- Конец кода ---
Навигация
Перейти к полной версии