0

我正在尝试生成 100 个随机位(1,-1)的数据包(每个大小为 8192 的行向量),使用巴特沃斯滤波器对它们进行过滤,然后绘制它们的平均功率谱密度。我必须使用 MATLAB 来执行此操作。我的 o/p 应该是具有非常尖锐峰值的滤波 sinc。当我将此代码用于较小尺寸的数据包时,它说 100 它可以工作。但对于 8192 则不然。我希望有人检查我的代码是否有错误。

%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'
4

2 回答 2

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'
于 2014-02-09T09:51:46.220 回答
0

取过滤数据的绝对值

代替

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

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

给出一个尖峰,可以在这里看到

于 2016-01-30T03:48:03.897 回答