MATLAB信号仿真 MATLAB数字信号处理信号与系统相关实验和仿真 模拟系统调制解调仿真 音频信号处理脉冲压缩技术GUI界面设计 低通高通带通滤波器最近在折腾MATLAB信号仿真时发现个有趣的现象——调幅广播信号在时域看着像被捏变形的正弦波频谱上却老老实实排着队。今天就拿这个当引子聊聊怎么用MATLAB玩转信号系统那些事儿。先来点硬核的直接上代码生成个调幅信号fs 1e5; % 采样率得够高不然频谱会打架 t 0:1/fs:0.1; fc 10e3; % 载波频率10kHz fm 1e3; % 基带信号1kHz A 0.8; % 调制度别超1会过调幅 carrier cos(2*pi*fc*t); message 0.5*cos(2*pi*fm*t); AM (1 A*message).*carrier;这段代码有个小陷阱如果A超过1调制后的信号会出现过零点畸变。频谱分析更直观N 2^nextpow2(length(AM)); f fs*(-N/2:N/2-1)/N; spectrum fftshift(fft(AM,N)/N); figure plot(f/1e3, 20*log10(abs(spectrum))) xlabel(kHz), ylabel(dB) axis([-15 15 -50 0])运行后能看到明显的载波峰和两个边带像极了三明治结构。这种可视化对理解调制原理特别有帮助比公式推导直观十倍。滤波是信号处理的必修课。最近在做一个语音降噪项目时发现用fir1设计滤波器时加个窗函数效果大不同% 设计48阶高通滤波器切掉50Hz工频干扰 order 48; cutoff 60/(fs/2); b fir1(order, cutoff, high, chebwin(order1, 50)); % 应用零相位滤波 clean_signal filtfilt(b, 1, noisy_signal);这里用了两个秘籍chebwin窗抑制旁瓣filtfilt实现零相位。实测发现用filtfilt处理后的语音时延几乎为零特别适合实时系统。MATLAB信号仿真 MATLAB数字信号处理信号与系统相关实验和仿真 模拟系统调制解调仿真 音频信号处理脉冲压缩技术GUI界面设计 低通高通带通滤波器说到GUI设计最近给实验室做了个简易的频谱分析工具。关键在axes控件的实时更新function update_plot(hObject, eventdata, handles) Fs str2double(get(handles.samplerate_edit, String)); x getaudiodata(handles.recorder); % 计算FFT L min(length(x), 4096); Y fft(x(1:L)); P2 abs(Y/L); P1 P2(1:L/21); P1(2:end-1) 2*P1(2:end-1); f Fs*(0:(L/2))/L; % 更新频谱图 set(handles.spectrum_plot, XData, f, YData, 20*log10(P1)) drawnow end这个回调函数实现了音频信号的实时频谱显示秘诀在于用drawnow强制刷新图形而不阻塞程序运行。最后分享个脉冲压缩的实战案例。雷达信号处理中常用线性调频信号T 10e-6; % 脉冲宽度 B 30e6; % 带宽 K B/T; % 调频率 t -T/2:1/fs:T/2; chirp_signal exp(1j*pi*K*t.^2); % 脉冲压缩处理 compressed fftshift(ifft(fft(chirp_signal).*conj(fft(chirp_signal))));处理后的信号主瓣宽度变窄分辨率显著提升。不过要注意采样率必须满足带宽要求否则会出现频谱混叠。玩转这些技术后突然明白信号处理就像烹饪——同样的食材信号不同处理手法算法能做出完全不同的味道结果。下次准备试试把音乐信号通过带通滤波器组做成实时频谱灯或许能解锁新的技能树呢。