matlab实验-经典谱估计(自相关法)

内容:计算并画出下述信号的功率谱

x(t)=y(t)+A_1*sin(2*π*f_1*t)+A_2*sin(2*π*f_2*t)+A_3*sin(2*π*f_3*t)

其中,归一化频率f_1=0.1,f_2=0.28,f_3=0.3,y(t)是白噪声u(t)经过FIR滤波器的输出,滤波器参数为B=[1,-0.1,0.09,0.648].

要求:采用自相关法,画出x(t)的功率谱。

说明: 1.产生白噪声,功率为0.1(randn),通过FIR滤波器产生y(t)(filter)

            2.产生x(t)

            3.画信号的功率谱(freqz)

            4.用自相关法画x(t)的功率谱(fft)

            5.Welch方法画x(t)的功率谱

MATLAB代码实现:

% MATLAB 滤波器设计和信号处理

% 参数设置
A1 = 1.0; A2 = 1.0; A3 = 1.0; % 振幅
f1 = 0.1; f2 = 0.28; f3 = 0.3; % 归一化频率
B = [1, -0.1, 0.09, 0.648];    % 滤波器系数
N = 1024;                      % 信号点数
fs = 1;                        % 采样频率
t = (0:N-1) / fs;              % 时间向量

% 生成白噪声
rng(0); % 随机数生成器的种子,确保可重复性
u = randn(N, 1) * sqrt(0.1);

% 通过FIR滤波器滤波
y = filter(B, 1, u);

% 生成信号x(t)
x = y + A1 * sin(2 * pi * f1 * t') + A2 * sin(2 * pi * f2 * t') + A3 * sin(2 * pi * f3 * t');

% 使用freqz计算FIR滤波器的频率响应
[h, w] = freqz(B, 1, 8000, fs);
figure;
subplot(1, 1, 1);
plot(w, 20 * log10(abs(h)));
title('FIR滤波器的频率响应');
xlabel('频率 (Hz)');
ylabel('幅度 (dB)');


% 使用FFT计算x(t)的功率谱密度(自相关法)
Rxx = xcorr(x, 'biased');
psd_fft = abs(fft(Rxx, N));
f_fft = linspace(0, fs/2, N/2);
figure;
subplot(1, 1, 1);
plot(f_fft, psd_fft(1:N/2));
title('x(t)的功率谱密度 - FFT(自相关法)');
xlabel('频率 (Hz)');
ylabel('功率');

% 使用Welch方法计算x(t)的功率谱密度
[pxx, f] = pwelch(x, hamming(256), 128, 256, fs);
figure;
subplot(1, 1, 1);
plot(f, pxx);
title('x(t)的功率谱密度 - Welch方法');
xlabel('频率 (Hz)');
ylabel('功率');

运行结果: 

 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
3种经典功率谱估计MATLABA代码-功率谱代码.doc 3种MATLAB经典谱估计 希望对大家有用~ 附件所有代码: 直接: 直接又称周期图,它是把随机序列x的N个观测数据视为一能量有限的序列,直接计算x的离散傅立叶变换,得X,然后再取其幅值的平方,并除以N,作为序列x真实功率谱的估计Matlab代码: clear; Fs=1000; %采样频率 n=0:1/Fs:1; %产生含有噪声的序列 xn=cos 3*cos randn); window=boxcar); %矩形窗 nfft=1024; [Pxx,f]=periodogram; %直接 plot); 改进的直接: 对于直接的功率谱估计,当数据长度N太大时,谱曲线起伏加剧,若N太小,谱的分辨率又不好,因此需要改进。 1. Bartlett Bartlett平均周期图的方是将N点的有限长序列x分段求周期图再平均。 Matlab代码: clear; Fs=1000; n=0:1/Fs:1; xn=cos 3*cos randn); nfft=1024; window=boxcar); %矩形窗 noverlap=0; %数据无重叠 p=0.9; %置信概率 [Pxx,Pxxc]=psd; index=0:round; k=index*Fs/nfft; plot_Pxx=10*log10); plot_Pxxc=10*log10); figure plot; pause; figure plot; 2. Welch Welch对Bartlett进行了两方面的修正,一是选择适当的窗函数w,并再周期图计算前直接加进去,加窗的优点是无论什么样的窗函数均可使谱估计非负。二是在分段时,可使各段之间有重叠,这样会使方差减小。 Matlab代码: clear; Fs=1000; n=0:1/Fs:1; xn=cos 3*cos randn); nfft=1024; window=boxcar; %矩形窗 window1=hamming; %汉明窗 window2=blackman; %blackman窗 noverlap=20; %数据无重叠 range='half'; %频率间隔为[0 Fs/2],只计算一半的频率 [Pxx,f]=pwelch; [Pxx1,f]=pwelch; [Pxx2,f]=pwelch; plot_Pxx=10*log10; plot_Pxx1=10*log10; plot_Pxx2=10*log10; figure plot; pause; figure plot; pause; figure plot; 复制代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值