间接法加窗分析信号的功率谱

news2024/10/6 1:38:30

     

       本篇文章是博主在通信等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对通信等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在   通信领域笔记

          通信领域笔记(3)---《间接法加窗分析信号的功率谱》

间接法加窗分析信号的功率谱

目录

1、设计要求

2、理论分析推导

 2.1间接法理论分析

 2.2窗函数理论分析

3、仿真及结果分析

3.1.1五种窗函数的时域频域比较

3.1.2五种窗函数进行截断的频谱泄露差异

3.1.3 五种窗函数计算功率谱


1、设计要求


2、理论分析推导

2.1间接法理论分析

        维纳辛钦定理指出,随机信号的相关函数与它的功率谱是一对傅里叶变换对。BT法就是基于这个原理。先由观测数据估计出自相关函数,然后求自相关函数的傅立叶变换,以此变换作为对功率谱的估计,也称为间接法。BT法要求信号长度N以外的信号为零,这也造成BT法的局限性。

  2.2窗函数理论分析

        当输入一个信号,我们需要截取它其中的一段来进行研究,就可以用加窗来实现,这里窗长就是截取长度。但因为之后我们会研究截取信号的频谱,需要对其进行傅里叶变换,而傅里叶变换又是作用于正负无穷的,所以要先对截取信号进行周期扩展。

        此时,若截取为整周期截取,周期扩展之后还是原信号,因此不会出现频谱泄露;若为非整周期截取,或信号根本就不是周期信号,截取信号不能表示整个信号,周期扩展之后信号的频谱会在每个周期相连的地方出现高次谐波,产生Gibbs现象,造成频谱泄露。

        这里可以延伸出一个如何选择窗函数来减小频谱泄露的问题。即要求窗函数频谱的主瓣尽量窄、旁瓣衰减尽量大。但二者不可兼得,因此要根据实际需求选择窗函数。主瓣越窄的窗函数的频率识别精度越高;旁瓣衰减越大的窗函数的幅度识别精度越高。

        每次FFT变换只能对有限长度的时域数据进行变换,因此,需要对时域信号进行信号截断。即使是周期信号,如果截断的时间长度不是周期的整数倍(周期截断),那么,截取后的信号将会存在泄漏。为了将这个泄漏误差减少到最小程度,我们需要使用加权函数,也叫窗函数。

        加窗主要是为了使时域信号似乎更好地满足FFT处理的周期性要求,减少泄漏。而窗函数的实质是,时域上与输入信号相乘,频域上,与输入信号做卷积。针对于常用的五种窗函数:矩形窗、汉明窗、汉宁窗、布莱克曼窗、凯撒窗进行分析和仿真。

         这种窗函数在时域上近似于一个扁长的椭圆,它在频域上使主瓣能量与旁瓣能量之比达到最大。与其他窗函数相比,凯撒窗的一个显著特点是它可以同时调整主瓣和旁瓣的宽度。例如,β增加时,相对旁瓣衰减降低,而主瓣宽度则会增加。


3、仿真及结果分析

3.1.1五种窗函数的时域频域比较

比较五种窗函数的旁瓣高度以及主瓣宽度。

 从频域图可以看出,旁瓣衰减程度从大到小排列依次为:

        布莱克曼窗 > 汉宁窗 > 汉明窗 > 矩形窗 > 凯撒窗

主瓣宽度从大到小排列依次为:

        矩形窗 > 凯撒窗 > 汉明窗 > 汉宁窗  > 布莱克曼窗

        主瓣宽度的增加会导致频谱的分辨率降低。因此,对于窗函数而言,频谱分辨率和旁瓣的衰减不可兼得。

3.1.2五种窗函数进行截断的频谱泄露差异

 

 3.1.3 五种窗函数计算功率谱

间接法加窗求解的窗函数功率谱图比较

       

 加入5dB、0dB、-5dB、-10dB高斯白噪声功率谱比较图:

                          

                          


补充信号功率谱分析

Welch法加窗求解的窗函数功率谱图比较

                           

 

 4、Matlab程序实现

%% 时间:2023.11.8

%通过Matlab产生如下信号:x(n)=2cos(2pif1n)+2cos(2pif2n)+2cos(2pif3n)+v(n)
%其中f1=0.05、f2=0.40、f3=0.42,
% v(n)是实高斯白噪声(信噪比由5dB至-10dB,步进5dB),f1-f3均为归一化的频率。
%针对间接法,首先产生不同的窗函数;
%观察不同窗函数(矩形、布莱克曼、汉宁、汉明、凯撒等)的时域、频域情况,
%总结不同窗函数的优缺点;
%然后使用不同的窗函数进行处理观察功率谱变化情况,并分析产生结果的原因。

clc;
clear;
close all;

%% 信号的生成
N=200;%采样点数
Fs = 1000;  %采样频率
fc1 = 0.05*Fs; % 归一化载波频率转化为载波频率
fc2 = 0.40*Fs;
fc3 = 0.42*Fs;
n = 0:1/Fs:(N-1)/Fs;

xn = 2*cos(2*pi*fc1*n) + 2*cos(2*pi*fc2*n) + 2*cos(2*pi*fc3*n);
xn = awgn(xn,5);  %加入高斯白噪声信号
nfft = N;

%% 窗函数的时域频域分析
window1=zeros(1,N);
window2=zeros(1,N);
window3=zeros(1,N);
window4=zeros(1,N);
window5=zeros(1,N);
L = 3*N/4;
a1=transpose(hamming(L)); %汉明窗
a2=transpose(blackman(L)); %布莱克曼窗
a3=transpose(hann(L)); %汉宁窗
a4=transpose(kaiser(L)); %凯撒窗
a5=transpose(boxcar(L)); %矩形窗
for i=1:L
    window1(i)=window1(i)+transpose(a1(i));
    window2(i)=window2(i)+transpose(a2(i));
    window3(i)=window3(i)+transpose(a3(i));
    window4(i)=window4(i)+transpose(a4(i));
    window5(i)=window5(i)+transpose(a5(i));
end

%% 五种窗函数的时域频域比较
 wvt = wvtool(a1,a2,a3,a4,a5);
 legend(wvt.CurrentAxes,'汉明窗','布莱克曼窗','汉宁窗','凯撒窗','矩形窗');

%% 窗函数采样点全选取
% L = N;
% window1=transpose(hamming(L)); %汉明窗
% window2=transpose(blackman(L)); %布莱克曼窗
% window3=transpose(hann(L)); %汉宁窗
% window4=transpose(kaiser(L)); %凯撒窗
% window5=transpose(boxcar(L)); %矩形窗

%% 单个窗函数的时域频域分析
wvtool(boxcar(L));
wvtool(hamming(L));
wvtool(blackman(L));
wvtool(hann(L));
wvtool(kaiser(L));

%% 间接求功率谱法
%间接法先由序列x(n)估计出自相关函数R(n),
%然后对R(n)进行傅里叶变换,便得到x(n)的功率谱估计

%加窗后的信号
xn1=xn.*window1;
xn2=xn.*window2;
xn3=xn.*window3;
xn4=xn.*window4;
xn5=xn.*window5;

%计算序列的自相关函数
%不加窗自相关函数的傅里叶变换
cxn = xcorr(xn);
CXk = fft(cxn,nfft);
Pxx = abs(CXk);
%汉明窗自相关函数的傅里叶变换
cxn1 = xcorr(xn1);
CXk1 = fft(cxn1,nfft);
Pxx1 = abs(CXk1);
%布莱克曼窗自相关函数的傅里叶变换
cxn2 = xcorr(xn2);
CXk2 = fft(cxn2,nfft);
Pxx2 = abs(CXk2);  
%汉宁窗自相关函数的傅里叶变换
cxn3 = xcorr(xn3);
CXk3 = fft(cxn3,nfft);
Pxx3 = abs(CXk3);  
%凯撒窗自相关函数的傅里叶变换
cxn4 = xcorr(xn4);
CXk4 = fft(cxn4,nfft);
Pxx4 = abs(CXk4);  
%矩形窗自相关函数的傅里叶变换
cxn5 = xcorr(xn5);
CXk5 = fft(cxn5,nfft);
Pxx5 = abs(CXk5);  

index = 0:round(nfft/2-1);
f = index*Fs/N;
plot_Pxx = 10*log10(Pxx(index+1)); 
plot_Pxx1 = 10*log10(Pxx1(index+1)); 
plot_Pxx2 = 10*log10(Pxx2(index+1)); 
plot_Pxx3 = 10*log10(Pxx3(index+1)); 
plot_Pxx4 = 10*log10(Pxx4(index+1)); 
plot_Pxx5 = 10*log10(Pxx5(index+1)); 

%% 窗函数功率谱图比较
figure(7);
subplot(311);
plot(f,plot_Pxx);
title('原信号功率谱');
subplot(312);
plot(f,plot_Pxx5);
title('矩形窗功率谱');
subplot(313);
plot(f,plot_Pxx1);
title('汉明窗功率谱');

figure(8);
subplot(311);
plot(f,plot_Pxx2);
title('布莱克曼窗功率谱');
subplot(312);
plot(f,plot_Pxx3);
title('汉宁窗功率谱');
subplot(313);
plot(f,plot_Pxx4);
title('凯撒窗功率谱');

figure(9);
hold on
plot(f,plot_Pxx);
plot(f,plot_Pxx1);
plot(f,plot_Pxx2);
plot(f,plot_Pxx3);
plot(f,plot_Pxx4);
plot(f,plot_Pxx5);
title('五种窗功率谱比较');
legend('原信号','汉明窗','布莱克曼窗','汉宁窗','凯撒窗','矩形窗');
hold off

     文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者关注VX公众号:Rain21321,联系作者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1251689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图解系列】一张图带你了解 DevOps 生态工具

一张图带你了解 DevOps 生态工具 ✅ 协作(Collaborate):JIRA、Confluence 大家肯定不陌生了,我之前也写过利用 Jekyll 搭建个人博客的帖子。✅ 构建(Build):常用的 SCM(Software Con…

每日一题--删除链表的倒数第 N 个结点

破阵子-晏殊 燕子欲归时节,高楼昨夜西风。 求得人间成小会,试把金尊傍菊丛。歌长粉面红。 斜日更穿帘幕,微凉渐入梧桐。 多少襟情言不尽,写向蛮笺曲调中。此情千万重。 目录 题目描述: 思路分析: 方法及…

01 _ 高并发系统:它的通用设计方法是什么?

我们知道,高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳地被系统中的服务和组件…

全面(16万字)深入探索深度学习:基础原理到经典模型网络的全面解析

前言 Stacking(堆叠) 网页调试 学习率:它决定了模型在每一次迭代中更新参数的幅度激活函数-更加详细 激活函数的意义: 激活函数主要是让模型具有非线性数据拟合的能力,也就是能够对非线性数据进行分割/建模 如果没有激活函数: 第一个隐层: l…

php订单发起退款(余额和微信支付)

index.html <a class="btn btn-danger btn-change btn-tuikuan btn-disabled" href="javascript:;"><i class="fa fa-tuikuan"></i> 订单退款</a>-->order.js // 为表格绑定事件Table.api.bindevent(table);//退款…

Android : Intent(意图)_页面跳转、传递数据_简单应用

示例图&#xff1a; MainActivity.java package com.example.myintent;import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContract; import andro…

【Web】CmsEasy 漏洞复现

访问主页 到处点一点没啥发现 扫目录 访问/admin 账号密码都是admin admin,不知道为什么&#xff0c;这里就先当作是默认吧 &#xff08;其实都是信息检索&#xff0c;能在网上搜到就行hhh&#xff09; 登录成功 看到左边列表有模板&#xff0c;心里大概有数了哈 进行一波历…

不要再往下翻了,你要的女宝穿搭我都有哦

分享女儿的睡衣穿搭 清新自然的浪漫紫 一眼就击中了我的心巴 软糯亲肤上身体验感超赞 轻松自在无束缚 防风又保暖&#xff0c;居家外出都可哦

Python 安装django-cors-headers解决跨域问题

一、PythonCorsHeaders概念 PythonCorsHeaders是一个轻量级的Python工具&#xff0c;用于解决跨域HTTP请求的问题。它允许你指定哪些网站或IP地址可以访问你的站点&#xff0c;并控制这些站点可以访问哪些内容。 现代网站越来越多地使用Ajax技术&#xff0c;使得浏览器能够从不…

RK3588硬编解码MPP环境配置

1. 简介 瑞芯微提供的媒体处理软件平台&#xff08;Media Process Platform&#xff0c;简称 MPP&#xff09;是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理&#xff0c;其目的是为了屏蔽不 同芯片的差异&#xff0c;为使用者…

零基础学python第一天||数和四则运算

数和四则运算 一提到计算机&#xff0c;当然现在更多人把她叫做电脑&#xff0c;这两个词都是指computer。不管什么&#xff0c;只要提到她&#xff0c;普遍都会想到她能够比较快地做加减乘除&#xff0c;甚至乘方开方等。乃至于&#xff0c;有的人在口语中区分不开计算机和计…

科研/比赛必备工具及系列笔记集合

科研/比赛必备工具及系列笔记集合 零、前言一、常用工具系列1.1 笔记平台使用感受系列1.2 常用开发平台系列 二、论文系列2.1 检索工具系列2.2 投稿调研系列2.3 常见国际期刊/会议2.4 常见中文核心期刊/会议 三、文献系列3.1 画图工具系列3.2 翻译工具系列3.3 英文纠正系列3.4 …

Vue + Element UI 实现复制当前行数据功能及解决复制到新增页面组件值不更新的问题

文章目录 引言第一部分&#xff1a;复制当前行数据功能的实现1.1 环境准备1.2 创建表格并渲染数据1.3 解决复制的数据不更新问题 第二部分&#xff1a;拓展知识2.1 Vue的响应性原理2.2 Element UI的更多用法 结语 Vue Element UI 实现复制当前行数据功能及解决复制到新增页面组…

JAVA小游戏“简易版王者荣耀”

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im…

初出茅庐的小李之C语言必备知识预处理

编译预处理 编译预处理就是在编译源代码之前进行的一系列处理&#xff0c;将源程序中的一些特殊命令进行展开或处理&#xff0c;生成扩展的源代码。这些特殊命令通常以“#”开头&#xff0c;占单独的行&#xff0c;语句尾部不需要加分号。 宏定义 (#define)是一种常见的编译…

Leetcode—55.跳跃游戏【中等】

2023每日刷题&#xff08;四十&#xff09; Leetcode—55.跳跃游戏 贪心法实现代码 #define MAX(a, b) ((a > b)? (a): (b))bool canJump(int* nums, int numsSize) {int k 0;for(int i 0; i < numsSize; i) {if(i > k) {return false;}k MAX(k, i nums[i]);}r…

[架构之路-251]:目标系统 - 设计方法 - 软件工程 - 软件建模 - 什么是建模,什么是软件系统建模?软件系统阶段性建模?正向建模与反向建模?

目录 前言&#xff1a; 一、什么是建模 1.1 什么是建模 1.2 常见的建模的方式与种类 二、什么是软件系统建模 2.1 软件系统建模的概念 2.2 软件系统常见的三种建模方法和手段 2.3 软件系统建模的常见工具 三、软件系统阶段性建模 3.1 软件工程在不同阶段对软件系统进…

竞赛选题 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于pyt…

[多线程】线程安全问题

目录 1.举个栗子 2.线程安全的概念 3.线程不安全的原因 3.1原子性 3.2Java内存模型&#xff08;jvm&#xff09; 3.3代码重排序 4.解决线程的不安全问题-&#xff08;synchronized&#xff09; ​编辑 4.1sychronized的特性 4.2刷新内存 4.3可重入 5.synchornized使…

【nacos】配置使用

nacos配置 遇见的问题 代码启动成功&#xff0c;但是配置文件未生效 观察报错 无报错&#xff0c;也看到了加载的配置文件路径&#xff0c;但是配置未生效 [main] [TID: N/A] c.a.c.n.refresh.NacosContextRefresher : [Nacos Config] Listening config: dataIda-servi…