2014-02-09 2 views
0

Я пытаюсь создать 100 пакетов (векторы строк каждого размера 8192) случайных битов (1, -1), фильтровать их с помощью butterworth фильтруют, а затем определяют их среднюю спектральную плотность мощности. Я должен сделать это с помощью MATLAB.My o/p должен быть отфильтрованным sinc с очень резким пиком. Когда я использую этот код для пакетов меньшего размера, скажем, что 100 работает. Но для 8192 это не так. Я хочу, чтобы кто-то просмотрел мой код для ошибок, пожалуйста.Мне нужно вычислить среднюю спектральную плотность мощности после прохождения пакетов через фильтр масляного фильтра с использованием MATLAB

%generates a random square matrix of 8192x8192 
n=rand(8192); 
%initiates a row vector of 64 zeros 
B=zeros(1,64); 
%makes a butterworth(lowpass) filter 
[num,den]=butter(20,.6); 
%two for loops to generate 100 row vectors(packets) each of size 8192 that 
%give 1 for any value greater than 0.5 and vice versa 
for c=1:100 
for k=1:8192 
if n(c,k)>=0.5 
n(c,k)=1; 
else 
n(c,k)=-1; 
end 
%filter the generated vectors and calculate average power spectral density 
x=filter(num,den,n(c,:)); 
A=fftshift(fft(x,64)); 
psd=A.*conj(A); 
B=B+psd; 
end 
end 
plot(B./100) 
xlabel 'Frequency', ylabel 'Average Power Spectral Density' 

ответ

0

Я видел две вещи:

Первый: Я думаю, что второй end должен быть в другом положении:

%generates a random square matrix of 8192x8192 
n=rand(8192); 

%initiates a row vector of 64 zeros 
B=zeros(1,64); 
%makes a butterworth(lowpass) filter 
[num,den]=butter(20,.6); 
%two for loops to generate 100 row vectors(packets) each of size 8192 that 
%give 1 for any value greater than 0.5 and vice versa 
for c=1:100 
    for k=1:8192 
     if n(c,k)>=0.5 
      n(c,k)=1; 
     else 
      n(c,k)=-1; 
     end 
    end 
     %filter the generated vectors and calculate average power spectral density 
     x=filter(num,den,n(c,:)); 
     A=fftshift(fft(x,64)); 
     psd=A.*conj(A); 
     B=B+psd; 

end 
plot(B./100) 
xlabel 'Frequency', ylabel 'Average Power Spectral Density' 

Второй: Он принимает навсегда, чтобы получить + 1 и -1, используя ваш код. Вы должны использовать операторы индексирования, что Matlab обеспечивает:

%generates a random square matrix of 8192x8192 
n=rand(8192); 
n(n>=0.5)=1; 
n(n<0.5)=-1; 

%initiates a row vector of 64 zeros 
B=zeros(1,64); 
%makes a butterworth(lowpass) filter 
[num,den]=butter(20,.6); 
%two for loops to generate 100 row vectors(packets) each of size 8192 that 
%give 1 for any value greater than 0.5 and vice versa 
for c=1:100 
     %filter the generated vectors and calculate average power spectral density 
     x=filter(num,den,n(c,:)); 
     A=fftshift(fft(x,64)); 
     psd=A.*conj(A); 
     B=B+psd; 

end 
plot(B./100) 
xlabel 'Frequency', ylabel 'Average Power Spectral Density' 
+0

@phyrox ... спасибо миллион! Наконец, я получаю o/p для такого большого i/p. – Samia

+0

Но я все еще не получаю желаемого о/р, который должен быть пиком – Samia

0

Возьмите абсолютные значения отфильтрованных данных

Заменить

x=filter(num,den,n(c,:)); 

с

x=abs(filter(num,den,n(c,:))); 

дает острый пик, который может be seen here

 Смежные вопросы

  • Нет связанных вопросов^_^