AM調制是通信專業非常重要的一個知識點。今天我們使用MATLAB編程實現AM調制。
我們實現輸入一個載波信號的頻率與調制信號的頻率后,再輸入調幅度,得到已調信號的波形與包絡信號的波形,再使用FFT算法分析出已調信號的頻譜圖。
源代碼:
調制函數的編寫:
function AM_modulation(m, fm, fc)% 參數設置fs = 10*fc; % 自適應采樣頻率(滿足奈奎斯特準則)T = 2; % 信號持續時間(秒)t = 0:1/fs:T-1/fs; % 時間向量% 驗證調制參數合理性if m < 0error('調制指數不能為負數');endif fm >= fcwarning('調制頻率接近或超過載波頻率可能影響調制效果');end% 生成調制信號和已調信號modulating_signal = m * cos(2*pi*fm*t);carrier = cos(2*pi*fc*t);am_signal = (1 + modulating_signal) .* carrier;envelope = 1 + modulating_signal;envelope1 = -(1 + modulating_signal);% 繪制時域波形(增強可視化)figure('Name','AM調制時域分析','NumberTitle','off');ax1 = subplot(2,1,1);plot(t, am_signal, 'Color', [0 0.4470 0.7410], 'LineWidth', 1.2);hold on;plot(t, envelope, 'r--', 'Color', [0.8500 0.3250 0.0980], 'LineWidth', 1.5);plot(t, envelope1, 'r--', 'Color', [0.8500 0.3250 0.0980], 'LineWidth', 1.5);title(['AM時域波形 m=', num2str(m), ', f_m=', num2str(fm), 'Hz, f_c=', num2str(fc), 'Hz']);xlabel('時間 (s)');ylabel('幅度');legend('已調信號','理論包絡','Location','best');grid on;xlim([0 3/fm]); % 顯示3個調制周期% 局部放大觀察細節ax2 = subplot(2,1,2);plot(t, am_signal, 'Color', [0 0.4470 0.7410], 'LineWidth', 1.2);hold on;plot(t, envelope, '--', 'Color', [0.8500 0.3250 0.0980], 'LineWidth', 1.5);plot(t, envelope1, '--', 'Color', [0.8500 0.3250 0.0980], 'LineWidth', 1.5);title('局部放大');xlabel('時間 (s)');ylabel('幅度');xlim([0 1/fm]); % 顯示1個調制周期grid on;linkaxes([ax1,ax2],'y'); % 同步縱坐標范圍% 高級頻譜分析(手動實現FFT)N = length(am_signal);fft_data = zeros(1,N);% 離散傅里葉變換實現for k = 1:N/2+1cos_term = cos(2*pi*(k-1)*(0:N-1)/N);sin_term = -sin(2*pi*(k-1)*(0:N-1)/N);fft_data(k) = sum(am_signal.*(cos_term + 1i*sin_term));endP2 = abs(fft_data/N);P1 = P2(1:N/2+1);P1(2:end-1) = 2*P1(2:end-1);f = fs*(0:(N/2))/N;% 頻譜可視化(動態范圍調整)figure('Name','AM頻譜分析','NumberTitle','off');stem(f, P1, 'filled', 'MarkerSize',4, 'Color',[0.6350 0.0780 0.1840]);title(['信號頻譜 f_c=',num2str(fc),'±',num2str(fm),'Hz']);xlabel('頻率 (Hz)');ylabel('幅度');grid on;% 自動設置頻率顯示范圍freq_span = max(10*fm, 2*fc); % 自適應頻率范圍xlim([max(0,fc-3*fm) fc+3*fm]);xticks(unique([fc-fm, fc, fc+fm, linspace(fc-3*fm,fc+3*fm,5)]));% 標注主要頻率成分hold on;[~,idx] = max(P1);text(f(idx), P1(idx), sprintf('%.1fHz\n%.2f',f(idx),P1(idx)),...'VerticalAlignment','bottom');annotation('textbox',[0.15 0.7 0.2 0.1],'String',...sprintf('頻率分辨率:%.2fHz',fs/N),'EdgeColor','none');
end
腳本的編寫:
% 常規調制
input_m=input('請輸入調制指數:');
input_fm=input('請輸入調制信號頻率:');
input_fc=input('請輸入載波信號頻率:');
AM_modulation(input_m, input_fm, input_fc)
導出圖片
輸入參數后,生成相應的波形:
?
導出包絡波形和調制波形:
導出的頻譜圖:
?