fs = 10000; % 采样率 t = 0:1/fs:1; % 时间序列 Ac = 1; % 载波幅度 fc = 1000; % 载波频率 % 基带信号m(t) mt = sin(10*pi*t) + sin(30*pi*t); % DSB调制 st = Ac * mt .* cos(2*pi*fc*t); % 绘制时域波形 subplot(2,1,1) plot(t, st) xlabel('时间') ylabel('幅度') title('DSB调制信号时域波形') % 绘制幅度频谱图 subplot(2,1,2) f = -fs/2:1/(length(t)-1):fs/2; % 频率序列 Sf = fftshift(abs(fft(st))); plot(f, Sf) xlabel('频率') ylabel('幅度') title('DSB调制信号幅度频谱图')显示错误使用 plot 矢量长度必须相同。 出错 qq1 (line 23) plot(f, Sf),请修改代码
时间: 2024-03-24 09:41:02 浏览: 90
这个错误通常是由于f和Sf的长度不一致导致的。可以尝试将f和Sf的长度都设置为length(t),即:
```matlab
% 设置参数
fs = 10000; % 采样率
t = 0:1/fs:1; % 时间序列
Ac = 1; % 载波幅度
fc = 1000; % 载波频率
% 基带信号m(t)
mt = sin(10*pi*t) + sin(30*pi*t);
% DSB调制
st = Ac * mt .* cos(2*pi*fc*t);
% 绘制时域波形
subplot(2,1,1)
plot(t, st)
xlabel('时间')
ylabel('幅度')
title('DSB调制信号时域波形')
% 绘制幅度频谱图
subplot(2,1,2)
f = -fs/2:fs/length(t):fs/2-fs/length(t); % 频率序列
Sf = fftshift(abs(fft(st)));
plot(f, Sf)
xlabel('频率')
ylabel('幅度')
title('DSB调制信号幅度频谱图')
```
这样修改后,再次运行代码,应该就可以正确绘制出DSB调制信号的幅度频谱图了。
相关问题
fs = 10000; % 采样率 t = 0:1/fs:1; % 时间序列 Ac = 1; % 载波幅度 fc = 1000; % 载波频率 % 基带信号m(t) mt = sin(10*pi*t) + sin(30*pi*t); % DSB调制 st = Ac * mt .* cos(2*pi*fc*t);请扩展以上MATLAB语言实现对DSB调制信号的相干解调,并作出图形。
DSB调制信号的相干解调可以通过乘以相同频率的载波信号实现。具体实现过程如下:
```matlab
% 设置参数
fs = 10000; % 采样率
t = 0:1/fs:1; % 时间序列
Ac = 1; % 载波幅度
fc = 1000; % 载波频率
% 基带信号m(t)
mt = sin(10*pi*t) + sin(30*pi*t);
% DSB调制
st = Ac * mt .* cos(2*pi*fc*t);
% 相干解调
ct = cos(2*pi*fc*t); % 解调载波
rt = st .* ct; % 相乘得到解调信号
[b,a] = butter(6,2*fc/fs); % 设计6阶低通滤波器
yt = filter(b,a,rt); % 滤波得到解调后的信号
% 绘制时域波形
subplot(2,1,1)
plot(t, st)
hold on
plot(t, rt)
plot(t, yt)
xlabel('时间')
ylabel('幅度')
title('DSB调制信号和解调信号时域波形')
legend('DSB调制信号', '解调信号(未滤波)', '解调信号(滤波后)')
% 绘制幅度频谱图
subplot(2,1,2)
f = -fs/2:fs/length(t):fs/2-fs/length(t); % 频率序列
St = fftshift(abs(fft(st)));
Rt = fftshift(abs(fft(rt)));
Yt = fftshift(abs(fft(yt)));
plot(f, St)
hold on
plot(f, Rt)
plot(f, Yt)
xlabel('频率')
ylabel('幅度')
title('DSB调制信号和解调信号幅度频谱图')
legend('DSB调制信号', '解调信号(未滤波)', '解调信号(滤波后)')
```
运行上述代码后,可以得到DSB调制信号和解调信号的时域波形和幅度频谱图,如下图所示:
![DSB调制信号和解调信号的时域波形](https://img-blog.csdn.net/20180731162850357?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1bGx5X2Jsb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
![DSB调制信号和解调信号的幅度频谱图](https://img-blog.csdn.net/20180731163014895?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1bGx5X2Jsb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
可以看到,经过相干解调和低通滤波后,解调信号与原始基带信号基本一致,证明了相干解调的正确性。
% 加载语音信号 [x, Fs] = audioread('D:\matlab\R2016b\bin\speech.wav'); % speech.wav是一个WAV格式的语音文件 x = x(:,1); % 取其中一个声道的数据 % 设置参数 f0 = 1000; % 基带信号频率为1kHz fc = 3000; % 载波频率为3kHz fs = 8*fc; % 采样率为8倍载波频率 T = 1/fs; % 采样周期 % 构造基带信号 t = 0:T:(length(x)-1)*T; % 时间序列 m = x'; % 语音信号,转置为行向量 bm = m.*cos(2*pi*f0*t); % 乘上余弦信号 % 模拟加上载波信号 c = cos(2*pi*fc*t); % 载波信号 sb = bm.*c; % SSB信号 % 滤波 h = fir1(100, 2*f0/fs); % 低通滤波器 y = filter(h, 1, sb); % 滤波后的信号 % 解调 y_demod = y.*c; % 乘上载波信号 y_filtered = filter(h, 1, y_demod); % 低通滤波 y_down = y_filtered(1:fs/Fs:end); % 降采样 % 播放语音 soundsc(y_down, Fs); % 播放解调后的语音
这段代码是一个MATLAB程序,用于模拟单边带调制(SSB)信号的解调和播放。程序首先加载一个WAV文件,然后对其进行单边带调制,即将原始语音信号乘以一个余弦信号。接着,程序对乘积信号进行滤波和解调,最终将解调后的信号降采样并播放出来。如果你在运行程序时遇到了错误,请提供具体的错误消息和上下文,以便我可以更好地帮助你解决问题。
阅读全文