2016-03-31 3 views
0

Я пытаюсь написать код cyclic autocorrelation function в MATLAB следующим образом:ошибка с функцией циклической автокорреляционной

t=0:(N-1); 
t=t*Te; 
i_alpha=0; 
tau=-N2*Te:Te:N2*Te; 
alpha=-1/2:1/N:1/2; 
Ryy_cl=zeros(length(alpha),length(tau)); 
for alpha=alpha/Te 
    ind_tau=0; 
    i_alpha=i_alpha+1; 
    for k=tau 
     ind_tau=ind_tau+1; 

    if k>0 
%    Ryy_cl(i_alpha,ind_tau)=1/length(sig_bin_syl_mod(1:end- k))*sum((sig_bin_syl_mod(1:end-k)).*sig_bin_syl_mod(k+1:end)).*exp(1i*2*pi*alpha*t(1+k:length(sig_bin_syl_mod(1:end)))); 
       Ryy_cl(i_alpha,ind_tau)=(1/N)*sum((sig_bin_syl_mod(1:end-k)).*sig_bin_syl_mod(k+1:end)).*exp(-1i*2*pi*alpha*t(1:end-k)); 

     else 
      Ryy_cl(i_alpha,ind_tau)=(1/N)*sum((sig_bin_syl_mod(1-k:end)).*sig_bin_syl_mod(1:end+k)).*exp(-1i*2*pi*alpha*t(1-k:end)); 
     end 

    end 
end 

Я получаю сообщение об ошибке, и это на самом деле не показать то, что я ожидал. Согласно приведенным ниже формулам, как я могу это исправить?

+0

Какая ошибка? –

+0

Несоответствие размеров подзаголовков. –

ответ

0

Предоставленный вами код является неполным, поэтому трудно уверенно воспроизвести вашу ошибку. В частности, вы не определили сигнал (sig_bin_syl_mod), приращение выборки (Te) или длину сигнала (N).

Я получаю разные ошибки в зависимости от того, как я выбираю Те. Самое простое - выбрать Те = 1. Но это нереально. Частота дискретизации 1 МГц будет иметь Te = 1.0e-6.

Когда Te не является целым числом, вы можете видеть, что одна проблема заключается в том, что tau не будет целым числом, но вы назначаете k tau, а затем используете k как индекс.

Таким образом, ваш код имеет основные проблемы.

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

Во-первых, не пытайтесь получить СА для всех тау и альфа одним выстрелом. Сосредоточьтесь на правильной настройке функции для одной частоты цикла alpha и всех tau. Я собрал немало полезных сообщений о том, как это сделать на cyclostationary.wordpress.com.

Во-вторых, скорректированный один альфа-код в цикле. Затем постарайтесь сделать его эффективным.

Кстати, очень эффективный альтернативный способ оценки циклической автокорреляции состоит в том, чтобы сначала построить циклическую периодограмму (см. Мой сайт), а затем обратное преобразование Фурье. Это использует силу БПФ.

Наконец, эта ссылка на Quora обсуждает другую «циклическую автокорреляцию». Вы пытаетесь выполнить обработку циклостационарных сигналов, но эта ссылка касается только DFT/FFT и круговых сдвигов. См. Мой сайт для определения и свойств интересующей вас циклической автокорреляции.

Chad

+0

спасибо за ваш asnwer, я попытался также построить CAF с FFT/DFT, так как мы можем получить CA с помощью DFT (x (t) * x (t + tau)), но не получили значительного результата –

+0

сигнал (sig_bin_syl_mod) является сигналом BPSK с Te = 5e-6, согласно модели i. –

+0

Я имел в виду оценку CAF путем выполнения обратного преобразования Фурье циклической периодограммы: Rx (tau, alpha) = IFFT (X (f + alpha/2) X^* (f-alpha/2)). Это может быть немного проще для вас. Сначала убедитесь, что ваш код работает для alpha = 0, что является просто IFFT (X (f) X^* (f)), нормальной функцией автокорреляции. Затем переходите к альфа =/= 0. –