Обработка блока для этапа построения графика в реальном времени - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь изменить демонстрационный скрипт LTFAT, который записывает и воспроизводит потоковое аудио одновременно. Цель состоит в том, чтобы прочитать в блоке вектор и взять ДПФ из выборок блока, а затем сохранить одно значение фазы в частотном интервале на кадр. Затем я пытаюсь развернуть каждую отдельную фазу и построить ее в режиме реального времени. Кажется, проблема возникает, когда я передаю значение развернутой фазы в свою функцию графика, где кажется, что блок вообще перестает обрабатываться, и график отображает постоянный вывод нуля во времени.

function demo_blockproc_basicloop(source,varargin) 

if demo_blockproc_header(mfilename,nargin)
   return;
end

figure
title('Unwrapped Phase Vs. Time');
xlabel('Seconds');
ylabel('Phase');

% Basic Control pannel (Java object)
p = blockpanel({
               {'GdB','Gain',-20,20,0,21},...
               });

% Setup blocktream
try
    fs = block(source,varargin{:},'loadind',p);
catch
    % Close the windows if initialization fails
    blockdone(p);
    err = lasterror;
    error(err.message);
end

% Set buffer length to 30 ms
L = floor(30e-3*fs);

flag = 1;
%Loop until end of the stream (flag)


while flag && p.flag

   gain = blockpanelget(p,'GdB');
   gain = 10^(gain/20);

   [f,flag] = blockread(L); 

   % The following does nothing in the rec only mode.
   blockplay(f*gain);

   xVec = zeros(1,length(f));
   XVec = zeros(1,1);
   N = length(f);

   % Calculate the DFT of the sample within the circular buffer for only
   % the first value of the frequency bin.

   for k = 1:1
       for n = 1:N-1           
           xVec(k) = f(n).*exp(-1j*2*pi*((-N/2)+n-1)*((-N/2)+k-1)/N);
       end
       XVec = sum(xVec);
   end

  % Take the unwrapped phase value of the first term of the DFT  

  P = unwrap(angle(XVec(1)));

  phaseplot(P);  

end
blockdone(p);

function phaseplot(P)

  % Creat plot sequence using P to display phase shift in scrolling time.  

  h = animatedline;
  ax = gca;
  ax.YGrid = 'on';

  % Change unwrapped phase limits to appropriate range.

  ax.YLim = [-50 100];
  startTime = datetime('now');

  stop = false;

  while ~stop              
      % Get current time
      t =  datetime('now') - startTime;
      % Add points to animation
      addpoints(h,datenum(t),P)
      % Update axes
      ax.XLim = datenum([t-seconds(15) t]);
      datetick('x','keeplimits')
      drawnow
  end   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...