尽管在if语句中定义了变量,但未定义变量

时间:2017-08-26 09:50:50

标签: matlab octave

我正在编写一个程序来添加具有零均值和单位方差的高斯噪声 不使用八度音中的内置函数的信号:

t=0:0.001:2;
x1=sin(2*pi*10*t); 
x2=sin(2*pi*5*t)+sin(2*pi*50*t);
x3=x1+x2;
d=0;
L=length(x3);
for i = 1:L
d+=(abs(x3(i))^2);
endfor

Es=(1/L)*d;
SNR=20;

for i = 1:L
if (real(x3))
noise=sqrt(Es/SNR)*randn(1,L);
elseif (imag(x3))
noise=sqrt(Es/(2*SNR))*(randn(1,L)+(i*randn(1,L)));
endif  
endfor
x4=x3+noise;

fs=1000;
N=1024;

y=fftshift(fft(x4,N));

fval=(fs/N)*(-N/2:N/2-1);

subplot(2,1,1);
plot(t,x4,'g');
xlabel('Time');
ylabel('Amplitude');
title('x4(t)');

subplot(2,1,2);
plot(fval,y,'b');
xlabel('Frequency');
ylabel('Amplitude');
title('X4(f):Frequency Response');

figure
subplot(2,1,1);
plot(fval,abs(y),'r');
xlabel('Frequency');
ylabel('Amplitude');
title('Amplitude Response');

subplot(2,1,2);
plot(fval,angle(y),'m');
xlabel('Frequency');
ylabel('Amplitude');
title('Phase Response');

但我无法解决一直出现的错误:

    error: 'noise' undefined near line 27 column 7 

如何解决此错误?

1 个答案:

答案 0 :(得分:3)

您期望real(x3)的逻辑价值是什么?这就是你要问的。这就像问如果苹果,做... 什么是 apple ?由于这不是二进制值,也不是imag(x3),因此您的if语句将永远不会执行。目前尚不清楚您希望这个if语句做什么,但可以按如下方式进行一些逻辑操作:

real(x3) > imag(x3)
real(x3) == imag(x3) % You might want to do this within tolerance

正如Andy提到的那样,您可能正在寻找x3是真实的还是复杂的,从而修改您的if语句,如下所示:

if isreal(x3)
    noise=sqrt(Es/SNR)*randn(1,L);
else
    noise=sqrt(Es/(2*SNR))*(randn(1,L)+(i*randn(1,L)));
endif

不同之处在于x3 = 4real(x3) = 4,这不合逻辑,而isreal(x3) = true

代码存在很多问题,比如使用全新数组覆盖每个循环迭代的noise变量,将复杂变量i的循环索引i误认为是错误的所以我建议你看一下适合MATLAB / Octave编程的基本tutolrial。