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

Непонятное поведение шума

Это сигнал на корку подаю с АЦП. На выходе непосредственно корки БПФ шумовую дорожку колбасит(самый нижний сигнал). Также её колбасит и после вычисления модуля. Обратите так же внимание на сигнал source_error, он всегда в нуле.

Диаграмму формируют sop,eop и valid, они формируется верно,иначе бы source_error ругался..

16 минут назад, Kluwer сказал:

Резкий рост шума - это 100% перегруз по входу. Вот только что на на приёмнике радиолокационном поразвлекался: заварачивается НЧМ-сигнал с передатчика на приёмник, у нас есть возможность управлять цифровым аттенюатором. Пока динамики тракта хватает, "шумовая дорожка" - 3-4 разряда на АЦП, как и должно быть, заканчивается динамика - скачком дорожка шумовая увеличивается. Перегруз у вас, но внеполосные составляющие из-за нелинейностей срезаются, скорее всего, входными фильтрами и возникакет ощущение, что с синалом "всё в порядке".

Я же выше описал ситуацию, не заставляйте меня повторять снова. Сигнал сейчас подаю прям на АЦП с генератора, о каком перегрузе речь?

6 минут назад, Lmx2315 сказал:

Так автор выводил тот же массив данных в матлабе и там не было никаких скачков шума, я думаю в матлабе - двойная точность и у него проблем с разрядностью нет, а в корке fft в плисине есть.

 

На мой взгляд это очень похоже на правду. Но сомнения есть - почему это проявляется только при сильных сигналах? И я пробовал уменьшить ширину данных FFT (перекомпиливал корку) - результат не изменился.

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


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

25 минут назад, _sda сказал:

На мой взгляд это очень похоже на правду. Но сомнения есть - почему это проявляется только при сильных сигналах? И я пробовал уменьшить ширину данных FFT (перекомпиливал корку) - результат не изменился.

констрейны в плис выполняются? Заведите в плисине на корку сингнал с внутреннего dds будут ли особенности в поведении?

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


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

1 hour ago, _sda said:

Это сигнал на корку подаю с АЦП. На выходе непосредственно корки БПФ шумовую дорожку колбасит(самый нижний сигнал). Также её колбасит и после вычисления модуля. Обратите так же внимание на сигнал source_error, он всегда в нуле.

Диаграмму формируют sop,eop и valid, они формируется верно,иначе бы source_error ругался..

Video_2019-09-11_121229_out_fft.wmv

Я же выше описал ситуацию, не заставляйте меня повторять снова. Сигнал сейчас подаю прям на АЦП с генератора, о каком перегрузе речь?

На мой взгляд это очень похоже на правду. Но сомнения есть - почему это проявляется только при сильных сигналах? И я пробовал уменьшить ширину данных FFT (перекомпиливал корку) - результат не изменился.

В Матлабе есть возможность вызвать точную модель FFT-шной альтеровской корки, называется она Sfftmodel, а обёртку-скрипт для неё генерит Мегавиззард. Она даёт в точности то, что даст альтеровская корка до бита, только Мигавиззард дёргать не надо - параметры прямо в Матлабе меняются. Если есть DSPbuilder, то можно ещё и в Симулинке с точностью до управляющих сигналов проиграть и всё увидеть.

 

А вообще, мы на это натыкались, из-за того, что корка целочисленная (в отличии от Матлабовской функции) и если динамика ожидается на уровне хотя бы 40-50дБ, то отсчёты входного сигнала стоит на 2-4 разряда влево сдвиагть перед почачей на БПФ-корку, иначе рез-ты альтеровской корки и матлаба начинают заметно различаться. Это потому что, если вы внимательно прочитаете описание БПФ-мегакоры, то это не "тупое" БПФ, а там ещё после каждого блока "бабочек" стоит блок автомасштабирования, сигнал по мере прокатывания по каскадам, постоянно двигается влево-вправо, что бы уложиться в сетку (для этого там и выход блочного порядка имеется exp_out). И если у вас слишком велика динамика, то ошибки округления начинают накапливаться, даже если вы предельные 32 разряда поставили.

 

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

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


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

1 час назад, Lmx2315 сказал:

констрейны в плис выполняются? Заведите в плисине на корку сингнал с внутреннего dds будут ли особенности в поведении?

А какой вообще смысл загружать в плиску проект с невыполненными констрейнами?

Вот я подключил NCO на вход FFT, результат на видео. Ну не хочет моя корка работать как надо.

1 час назад, Kluwer сказал:

А вообще, мы на это натыкались, из-за того, что корка целочисленная ...

В моём случае БПФ с плавучкой.

Уже и шину данных БПФ менял от 12 до 24 бит - не помогает.

Мне до этого всегда хватало БПФ или 1К или 2К, это первый раз делаю 4К.

Если никаких версий больше нет, придётся переходить на 8К, может там повезёт.

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


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

8 minutes ago, _sda said:

А какой вообще смысл загружать в плиску проект с невыполненными констрейнами?

Вот я подключил NCO на вход FFT, результат на видео. Ну не хочет моя корка работать как надо.

Video_2019-09-11_145538.wmv

В моём случае БПФ с плавучкой.

Уже и шину данных БПФ менял от 12 до 24 бит - не помогает.

Мне до этого всегда хватало БПФ или 1К или 2К, это первый раз делаю 4К.

Если никаких версий больше нет, придётся переходить на 8К, может там повезёт.

Не повезёт. Если даже с плавающей запятой (почему-то все считают, что п.з. - это панацея от всех бед, ничего подобного, ибо главное - это разрядность мантиссы: у вас 24 бита) - это 144дБ. Но БПФ - интегральное преобразование, значит - вычитаем из этого размер БПФ. 4К - это 72дБ. Итого, всё, чем вы располагаетет - это 144-72 ~ 72дБ. А дальше - начинаются свистопляски с округлением. Переходом на 8К вы просто отрежете из своей динамики ещё 6дБ и всё.

 

Попробуйте уж лучше уйти на 4К целочисленные, влупив ему 32 разряда. И попробуйте, всё-таки, сделать то, что я вам выше рекомендовал: сдвиньте вход хотя бы на 2 разряда влево (<< 2).

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


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

30 минут назад, Kluwer сказал:

Не повезёт. Если даже с плавающей запятой (почему-то все считают, что п.з. - это панацея от всех бед, ничего подобного, ибо главное - это разрядность мантиссы: у вас 24 бита) - это 144дБ. Но БПФ - интегральное преобразование, значит - вычитаем из этого размер БПФ. 4К - это 72дБ. Итого, всё, чем вы располагаетет - это 144-72 ~ 72дБ. А дальше - начинаются свистопляски с округлением. Переходом на 8К вы просто отрежете из своей динамики ещё 6дБ и всё.

 

Попробуйте уж лучше уйти на 4К целочисленные, влупив ему 32 разряда. И попробуйте, всё-таки, сделать то, что я вам выше рекомендовал: сдвиньте вход хотя бы на 2 разряда влево (<< 2).

Попробовал - не понравилось. Сдвинул сигнал с NCO влево на 4 бита, уровень на спектре соответственно вырос, а болтанка как была так и осталась.

И если бы у меня было 72 децибела, но их нет.

Целочисленный режим возможен только для Variable Streaming FFT, уж не знаю как он мне подойдёт. У меня режим такой: по стартовому импульсу захватили блок 4К, преобразовали и долго ждём следующего старта. Так что Burst самое то, но он только с плавучкой.

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


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

23 hours ago, _sda said:

А то мне в голову лезут всякие мысли о том что ЛЧМ не аналоговый, а цифровой, формируется разными модуляторами с разными опорными генераторами. Это никак не может повлиять?

У цифрового ЛЧМ на выходе DDS могут в сигнале присутствовать спуры. Их амплитуда определенно зависит от уровня сигнала и от разрядности DDS в котором формируется ЛЧМ.

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


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

1 минуту назад, blackfin сказал:

У цифрового ЛЧМ на выходе DDS могут в сигнале присутствовать спуры. Их амплитуда определенно зависит от уровня сигнала и от разрядности DDS в котором формируется ЛЧМ.

А есть ли смысл для отладки запитать оба модулятора от одной опоры? Поможет с бородой?

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


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

_sda

Целочисленный режим возможен только для

В симулинке есть целочисленный "Burst" FFT, там же можно всю схему отладить, выявить переполнения и т. п.

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


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

3 минуты назад, petrov сказал:

_sda

Целочисленный режим возможен только для

В симулинке есть целочисленный "Burst" FFT, там же можно всю схему отладить, выявить переполнения и т. п.

А зачем мне в симулинке целочисленный burst если квартус генерит только float burst?

8 минут назад, blackfin сказал:

А что вы называете "бородой"?

борода

на картинке слева и справа от сигнала видна "борода", уж очень мешает. Для перемноженных ЛЧМ это нормально или сигнал должен быть чистым как с генератора?

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


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

3 minutes ago, petrov said:

_sda

Целочисленный режим возможен только для

В симулинке есть целочисленный "Burst" FFT, там же можно всю схему отладить, выявить переполнения и т. п.

Я уже писал об этом автору. Но и симулинк не нужен: Мегавизард генерит матлабовский обёртку-скрипт, к-рый вызывает альтеровский .dll Sfftmodel. Он с точностью до бита моделирует поведение альтеровской мегакоры.

Скрипт выглядит так:

% function [y, exp_out] = Custom_FFT_model(x,DATA_PREC,TWIDDLE_PREC,INVERSE)
%
% calculates the complex block-floating point FFT/IFFT of length N of a                  
%   complex input vector x                                                                   
%                                                                                            
%   Inputs:   x          : Input complex vector of length N. 
%                        : If the length of the vector doesn't fit                     
%                          N, error is generated.                               
%             N          : Transform Length                                                  
%             INVERSE    : FFT direction                                                     
%                          0 => FFT                                                          
%                          1 => IFFT                                                          
%                                                                                          
%   Outputs   y          : The transform-domain complex vector output                        
%             exp_out    : Block exponent value                                               
%                                                                                            
%   2001-2009 Altera Corporation, All Rights Reserved 
%                                                                                                  
%   Automatically Generated: FFT MegaCore Function 13.0 Build 232 July, 2013                                                                                                   
%
function [y, exp_out] = Custom_FFT_model(x,DATA_PREC,TWIDDLE_PREC,INVERSE,N) 
addpath(strcat(getenv('QUARTUS_ROOTDIR'),'/../ip/altera/fft/lib/'));
% Parameterization Space   
THROUGHPUT=4;
ARCH=1;
% DATA_PREC=23;
% TWIDDLE_PREC=23;
input_vector_length = length(x); 
if input_vector_length ~= N,
    error('Length of input vector doesn''t fit FFT size.');
end

rin = real(x);
iin = imag(x);
[roc,ioc,exp_out] = Sfftmodel(rin,iin,N,THROUGHPUT,ARCH,DATA_PREC,TWIDDLE_PREC,INVERSE);
y = roc+1j*ioc;
end                                                                          

Затягиваете в Матлаб и играетесь до посинения, пока не подберёте устраивающие параметры, не прикасаясь даже к Квартусу.

Вот, например, фрагмент кода - соглассованный фильтр на базе БПФ, сначала на матлабовских БПФ, потом - на Алтере:

% ---- First, Matlab's fft-based method ---------------------
rfft = fft(Input_IQ, Nfft);
Rfft = (2^(-Ntemplate))*ifft(rfft.*Sorig, Nfft); 

% ---- Second, Matlab's fft-based method ----------------------
% Do not forget to add '.\DSPBuilder_MatchingFilter_import' folder to the paths list

% Direct FFT
[X, exp_out_in] = Custom_FFT_model(Input_IQ, DATA_PREC, TWIDDLE_PREC, 0, Nfft); 
X = fix(X(1:Nfft));

% <=== MIDDLE_SCALE (shift on exp_out_in(1)+sbits_after) =========--============
Y = X.*Sorig; % Multiplication

% Scaling after the multiplication
Y = fix(Y.*2^(-(Ntemplate)));
Y = bi_cmplx_satu(Y, 0, DATA_PREC, Y); 

% Inverse FFT
[y, exp_out_out] = Custom_FFT_model(Y, DATA_PREC, TWIDDLE_PREC, 1, Nfft);

% Get rid of the tail
y = y.*[ones(1,Nw) zeros(1,Nfft-Nw)];

% <=== OUT_SCALE_stageI ========================================================
y = 2.^(-exp_out_out(1)-exp_out_in(1)-log2(Nfft)-sbits_before+sbits_after).*y; % 

 

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


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

_sda

А зачем мне в симулинке целочисленный burst если квартус генерит только float burst?

Оно и видно, как квартус "помогает" DSP задачи решать, в симулинке гораздо легче понять откуда все эти "бороды" лезут, оттуда же и HDL сгенерируете после отладки.

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


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

13 минут назад, Kluwer сказал:

Я уже писал об этом автору. Но и симулинк не нужен: Мегавизард генерит матлабовский обёртку-скрипт, к-рый вызывает альтеровский .dll Sfftmodel. Он с точностью до бита моделирует поведение альтеровской мегакоры.

Спасибо! А что за функция bi_cmplx_satu?

5 часов назад, soldat_shveyk сказал:

Не стоит. БПФ вряд ли глючит. 
Но если хотите в этом убедиться, подавайте на БПФ тестовый сигнал без участия АЦП. Подсуньте ему идеальный сигнал от NCO, например, и убедитесь, что с БПФ все в порядке :)

Можете как то прокомментировать ситуацию?

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


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

1 hour ago, _sda said:

на картинке слева и справа от сигнала видна "борода", уж очень мешает. Для перемноженных ЛЧМ это нормально или сигнал должен быть чистым как с генератора?

У вас с выходов двух DDS идут в первом приближении четыре сигнала:

 

A1_sweep(t) = A1*sin(ω1*t),

S1_spur(t) = S1*sin(ωs1*t),

A2_sweep(t) = A2*sin(ω2*t),

S2_spur(t) = S2*sin(ωs2*t).

 

На выходе смесителя будут сигналы:

 

S_mixer(t) = [A1*sin(ω1*t)+S1*sin(ωs1*t)]*[A2*sin(ω2*t)+S2*sin(ωs2*t)] = A1*A2*sin(ω1*t)*sin(ω2*t) + A1*S2*sin(ω1*t)*sin(ωs2*t) + A2*S1*sin(ω2*t)*sin(ωs1*t) + ...

 

S_mixer(t) = A1*A2*[cos(ω1*t - ω2*t) - cos(ω1*t + ω2*t)]/2 + A1*S2*[cos(ω1*t - ωs2*t) - cos(ω1*t + ωs2*t)]/2 + A2*S1*[cos(ω2*t - ωs1*t) - cos(ω2*t + ωs1*t)]/2 + ...

 

На выходе ФНЧ у вас останутся гармоники:

 

S_LPF(t) = A1*A2*cos(ω1*t - ω2*t)/2 + A1*S2*cos(ω1*t - ωs2*t)/2 + A2*S1*cos(ω2*t - ωs1*t)/2 + ...

 

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

 

ωs1 ≈ ω1

ωs2 ≈ ω2

 

То в спектре появятся линии расположенные рядом с частотой:

 

ω = ω1 - ω2

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


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

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

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

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

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

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

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

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

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

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