频谱搬移fftshift的对象应该是x信号的傅里叶变换X才对,你写成小写的x了。
x长度为300,X长度为256。改成我的这句即可:
plot([-128:127],fftshift(abs(X)));
画出来的是信号x的频谱幅度图,可以识别出30Hz的频率。
图就不贴了,楼主给分。
k=0:299; %待分析点数为300个
Fm=30;Fc=200;Fs=1000; %被调信号频率30Hz,载波信号频率200Hz,抽样频率1000Hz
t=k/Fs; %设置步长
x=sin(5*pi*Fm*t); %设置被调函数,初相为0
y=modulate(x,Fc,Fs,'amssb'); %利用modulate函数对载波进行单边但幅度调制
X=fft(x,256);
Y=fft(y,256); %利用快速傅里叶变换求被调函数和已调函数频谱
x2=demod(y,Fc,Fs,'amssb'); %利用demod函数对已调信号进解调
X2=fft(x2,256); %利用快速傅里叶变换求解调函数频谱
subplot(3,2,1);plot(x);xlabel('t(s)');ylabel('x');title('被调信号');
subplot(3,2,2);
plot([0:299],fftshift(abs(x))); %绘制被调信号及其频谱图
好了
错误好像是说,plot函数在作图是矢量的长度不一样。
建议,将subplot(3,2,2);plot(x);plot([-128:127],fftshift(abs(x))); 中的x改为X,这才是fft变换后得信号,长度是256.
>> y=modulate(x,Fc,Fs,'amssb'); %利用modulate函数对载波进行单边但幅度调制
>> X=fft(x,256);
>> Y=fft(y,256); %利用快速傅里叶变换求被调函数和已调函数频谱
>> x2=demod(y,Fc,Fs,'amssb'); %利用demod函数对已调信号进解调
>> X2=fft(x2,256); %利用快速傅里叶变换求解调函数频谱
>> subplot(3,2,1);plot(x);xlabel('t(s)');ylabel('x');title('被调信号');
>> subplot(3,2,2);plot(x);plot([-128:127],fftshift(abs(x))); %绘制被调信号及其频谱图
最后一行的fftshift(abs(x)长度为300,而[-128:127]只有256,要将两者调成一致。例如将[-128:127]改为[-150,149]。