使用 fft 查找每个谐波的相位

2024-03-09

我用的是Matlab。

我有一个正弦信号:

X(放大器:220/频率:50)

我添加了 3 个谐波:

x1 => (h2) 放大器:30 / 频率:100 / 相位:30°

x2 => (h4) 放大器:10 / 频率:200 / 相位:50°

x3 => (h6) 放大器:05 / 频率:300 / 相位:90°

我将所有信号加在一起(例如 X 包含 3 个谐波),所得信号称为:Xt

这是代码:

%% Original signal
X = 220.*sin(2 .* pi .* 50 .* t);

%% Harmonics
x1 = 30.*sin(2 .* pi .* 100 .* t + 30);
x2 = 10.*sin(2 .* pi .* 200 .* t + 50);
x3 = 05.*sin(2 .* pi .* 300 .* t + 90);

%% adding the harmonics
Xt = X + x1 + x2 + x3;

我想要做的是:找到从求和信号开始的 3 个谐波信号(它们的幅度、频率和相位)Xt并了解基本信号X(幅度和频率)!

到目前为止,我能够使用fft,检索谐波的频率和幅度,现在的问题是找到谐波的相位(在我们的例子中:30°、50° 和 90°)。


FFT 返回一个由复数组成的数组。要定义频率分量的相位,您需要对复数使用 angle() 函数。不要忘记:谐波的相位必须以弧度表示。

这是代码:

Fs = 1000; % Sampling frequency                     

t=0 : 1/Fs : 1-1/Fs; %time

X = 220*sin(2 * pi * 50 * t);

x1 = 30*sin(2*pi*100*t + 30*(pi/180));
x2 = 10*sin(2*pi*200*t + 50*(pi/180));
x3 = 05*sin(2*pi*300*t + 90*(pi/180));

%% adding the harmonics
Xt = X + x1 + x2 + x3;

%Transformation
Y=fft(Xt); %FFT

df=Fs/length(Y); %frequency resolution

f=(0:1:length(Y)/2)*df; %frequency axis


subplot(2,1,1);
M=abs(Y)/length(Xt)*2; %amplitude spectrum
stem(f, M(1:length(f)), 'LineWidth', 0.5);
xlim([0 350]);
grid on;  

xlabel('Frequency (Hz)')
ylabel('Magnitude');

subplot(2,1,2);
P=angle(Y)*180/pi; %phase spectrum (in deg.)
stem(f, P(1:length(f)), 'LineWidth', 0.5);
xlim([0 350]);
grid on;

xlabel('Frequency (Hz)');
ylabel('Phase (degree)');

它会导致如此混乱(但你可以很好地看到你的振幅):

您可以在第二张图上看到很多相位分量。但是,如果您消除与零幅度相对应的所有频率,您将看到您的相位。

我们到了:

Y=fft(Xt); %FFT

df=Fs/length(Y); %frequency resolution

f=(0:1:length(Y)/2)*df; %frequency axis

subplot(2,1,1);
M=abs(Y)/length(Xt)*2; %amplitude spectrum

M_rounded = int16(M(1:size(f, 2))); %Limit the frequency range
ind = find(M_rounded ~= 0);

stem(f(ind), M(ind), 'LineWidth', 0.5);
xlim([0 350]);
grid on;  

xlabel('Frequency (Hz)')
ylabel('Magnitude');

subplot(2,1,2);
P=angle(Y)*180/pi; %phase spectrum (in deg.)
stem(f(ind), P(ind), 'LineWidth', 0.5);
xlim([0 350]);
ylim([-100 100]);
grid on;

xlabel('Frequency (Hz)');
ylabel('Phase (degree)');

现在您可以看到相位,但所有相位都偏移到 90 度。为什么?因为 FFT 使用 cos() 而不是 sin(),所以:

X = 220*sin(2*pi*50*t + 0*(pi/180)) = 220*cos(2*pi*50*t - 90*(pi/180));

UPDATE

如果某些信号分量的参数不是整数怎么办?

让我们添加一个新组件x4:

x4 = 62.75*cos(2*pi*77.77*t + 57.62*(pi/180));

使用提供的代码,您将得到以下图:

这并不是我们真正期望得到的,不是吗?问题在于频率样本的分辨率。该代码用谐波来近似信号,其频率以 1 Hz 采样。显然,仅使用 77.77 Hz 这样的频率是不够的。

频率分辨率等于信号时间的倒数。在我们前面的例子中,信号的长度是 1 秒,这就是频率采样的原因1/1s=1Hz。因此,为了提高分辨率,需要扩大处理信号的时间窗口。为此,只需更正可用的定义t:

frq_res = 0.01; %desired frequency resolution

t=0 : 1/Fs : 1/frq_res-1/Fs; %time

它将产生以下光谱:

UPDATE 2

必须分析哪个频率范围并不重要。信号分量可能来自非常高的范围,如下一个示例所示。假设信号如下所示:

f=20e4; % 200 KHz
Xt = sin(2*pi*(f-55)*t + pi/7) + sin(2*pi*(f-200)*t-pi/7);

这是结果图:

相位偏移至 -90 度,如前所述。

这是代码:

Fs = 300e4; % Sampling frequency                     

frq_res = 0.1; %desired frequency resolution

t=0 : 1/Fs : 1/frq_res-1/Fs; %time

f=20e4;
Xt = sin(2*pi*(f-55)*t + pi/7) + sin(2*pi*(f-200)*t-pi/7);

Y=fft(Xt); %FFT

df=Fs/length(Y); %frequency resolution

f=(0:1:length(Y)/2)*df; %frequency axis

subplot(2,1,1);
M=abs(Y)/length(Xt)*2; %amplitude spectrum

M_rounded = int16(M(1:size(f, 2))); %Limit the frequency range
ind = find(M_rounded ~= 0);

stem(f(ind), M(ind), 'LineWidth', 0.5);
xlim([20e4-300 20e4]);
grid on;  

xlabel('Frequency (Hz)')
ylabel('Magnitude');

subplot(2,1,2);
P=angle(Y)*180/pi; %phase spectrum (in deg.)
stem(f(ind), P(ind), 'LineWidth', 0.5);
xlim([20e4-300 20e4]);
ylim([-180 180]);
grid on;

xlabel('Frequency (Hz)');
ylabel('Phase (degree)');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 fft 查找每个谐波的相位 的相关文章

  • matlab矩阵中求子矩阵的通用方法

    我正在寻找一种 好 方法来在更大的矩阵 任意维数 中找到矩阵 模式 Example total rand 3 4 5 sub total 2 3 1 3 3 4 现在我希望这样的事情发生 loc matrixFind total sub 在
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • 白色像素簇提取

    我正在研究指纹毛孔提取项目 并陷入毛孔 白色像素簇 提取的最后阶段 我有两个输出图像 我们可以从中获取毛孔 但不知道该怎么做 这两个图像的尺寸不同 image1 的尺寸为 240 320 image2 的尺寸为 230 310 这是我的图像
  • 这是 `min` 和 `nanmin` 之间的区别; Matlab 中的“max”和“nanmax”?

    Matlab描述nanmin and nanmax像这样 NANMIN最小值 忽略NaNs NANMAX最大值 忽略NaNs 但实际上 min and max ignore NaNs too 那我应该使用哪个 根据我的测试 nanmin a
  • 如何以编程方式指定 MATLAB 编辑器键绑定

    我想将键盘键绑定设置为Windows 默认设置我想在启动时使用startup m因为我希望在大量系统上设置此设置 首选项对话框中的等效设置是 MATLAB gt Keyboard gt Shortcuts gt Active Setting
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • python 正弦和余弦精度

    如何提高Python正弦和余弦精度 例如 我想使用以下代码 只需计算随机复向量 x 的 y cos acos x import numpy as np N 100000 x np zeros N 1j np zeros N for k in
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • 非模态 questdlg.m 提示

    我的代码绘制了一个图 然后提示用户是否想使用不同的参数绘制另一个图 问题是 当 questdlg m 打开时 用户无法查看绘图的详细信息 这是代码 while strcmp Cont Yes 1 Some code modifying da
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • 使用 FFT 执行音频分析

    我已经被这个问题困扰好几天了 并且浏览了几乎所有相关的 StackOverflow 页面 通过这次活动 我现在对 FFT 是什么及其工作原理有了更深入的了解 尽管如此 我在将其实现到我的应用程序中时遇到了极大的困难 简而言之 我想做的是为我
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • getappdata 在 MATLAB 中返回空矩阵

    我有一段代码 我在其中使用setappdata然后我使用以下方式调用数据getappdata即使它不为空 它也会返回一个空矩阵 我的一段简化代码如下 function edit1 Callback hObject eventdata han
  • 在 Matlab 的命令窗口中获取旧式帮助

    问题的简短版本 在最新版本的 Matlab 中 我在 Windows 上的 R2014b 和 R2015a 中看到过 当您键入help foo你得到一个简要描述 简介函数及其签名 例如 输入help bsxfun产生类似这样的东西 只有更好
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http
  • for 循环中的绘图没有可见点

    我正在努力解决我想使用 for 循环制作的情节 我知道当我在循环之后添加它时它会起作用 只是一个简单的图 但我想用另一种方式尝试一下 fib ones 1 10 for k 3 10 hold on fib k fib k 1 fib k
  • 在matlab中,如何读取python pickle文件?

    在 python 中 我生成了一个 p 数据文件 pickle dump allData open myallData p wb 现在我想在Matlab中读取myallData p 我的Matlab安装在Windows 8下 其中没有Pyt
  • Matlab的导入函数的范围是什么?

    我正在尝试将一些用 Matlab 编写的代码转换为独立的 编译的 Matlab 应用程序 然而 在出现一些奇怪的错误之后 我意识到代码大量使用了从路径中添加和删除的操作 以避免多次使用多个具有相同名称 但结果 计算不同 的函数这一事实 环顾
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看

随机推荐

  • 调整 UIAlertView 内 UIPickerView 的大小

    我想放一个UIPickerView in a UIAlertView但我似乎无法正确调整它的大小 这是我得到的 这是我的代码 let alertView UIAlertController title Select item from li
  • Javascript - 异步调用后同步

    我有一个 Javascript 对象 需要 2 次调用外部服务器来构建其内容并执行任何有意义的操作 该对象的构建使得实例化它的实例将自动进行这两个调用 这两个调用共享一个公共回调函数 该函数对返回的数据进行操作 然后调用另一个方法 问题是在
  • Angular Bootstrap 在 Angular 13 项目上给出错误

    我正在尝试安装角度引导程序 https ng bootstrap github io home在我的 Angular 13 项目中 如下所示 ng 添加 ng bootstrap ng bootstrap 但是当我在此语句上按 Y 时 我立
  • 如何在 Ektron 中选择属于某个分类的库项目

    我使用的是 Ektron CMS 版本 8 5 SP2 我有一些分类项目 有些是实际页面 有些是库项目 Word 文件和 PDF 等文档 假设我的分类中有 3 个页面和 2 个库项目 总共 5 个项目 我使用以下代码 ContentMana
  • CakePHP 2.0 $this->表单->input()

    这是我的add tcp 表名称 组 表字段 group id group desc PK group id 这是我的控制器 class GroupsController extends AppController public helper
  • 条形图的峰度、偏度? - Python

    在Python中确定条形图的倾斜 峰度的有效方法是什么 考虑到条形图没有分箱 与直方图不同 这个问题没有多大意义 但我想做的是确定图的高度与距离 而不是频率与箱 的对称性 换句话说 给定沿距离 x 测量的高度 y 值 即 y 6 18 10
  • 为什么 roxygen2 不会自动更新描述文件中的“导入”?

    我正在努力密切关注 hadley sbook http r pkgs had co nz 学习编写 R 包的最佳实践 我很高兴读到这些关于哲学 http r pkgs had co nz intro html本书内容 任何可以自动化的事情都
  • 如何在 ExpressionVisitor 中计算表达式?

    我需要在执行表达式之前使用 ExpressionVisitor 来分析它 根据我的需要 我需要评估除法表达式的正确部分 但我不知道该怎么做 这是我的示例代码 internal class RulesChecker ExpressionVis
  • 将 PostgreSQL text/bytea 列迁移到大对象?

    我有一个表 10k 行 用于存储大值text柱子 当前最大的未压缩大小为 417 MB 烘烤后为 85 MB 此设计的缺陷是无法传输这些值 例如通过 JDBC 使用此列的任何内容都必须将整个内容读入内存 是否有任何工具或快捷方式可用于将此列
  • 聚合查询中的 Mongodb java 展开操作抛出异常

    使用嵌入式 mongo 文档时 我尝试展开数组 但收到类似 org springframework data mapping model MappingInstantiationException Failed to instantiate
  • Qt Widgets 全屏边距

    我想创建一个程序 以全屏方式加载谷歌 所以我使用全屏方式打开了我的qt程序w showFullScreen 它工作得很好 但是当我添加QWebView并将其设置为centralWidget像这样 但是当我运行该程序时 我在窗口的两侧得到了一
  • UIWindow addSubview 上的偏移量

    我有一个基于 UITabBar 的应用程序 运行得很好 在某些情况下 我会显示不同的 UIViewController 现在让我烦恼的是我必须调整测试笔尖的框架 并且only测试笔尖 才能正确显示 否则视图位于状态栏下方 void appl
  • 制作一个具有我的应用程序透明背景的全屏绘画程序

    我的目标是制作一个小型 PC Windows 程序 它允许我在屏幕顶部进行绘制 并将结果保存为具有透明背景的 png 格式 像这样的软件Epic Pen https epic pen com or gInk https github com
  • print("\t",end='') 语句中 end='' 的含义? [复制]

    这个问题在这里已经有答案了 这是用于打印嵌套列表中所有值的函数 使用 Python 从 Head First 获取 def printall the list level for x in the list if isinstance x
  • 如何在FragmentActivity上设置工具栏?

    我想设置toolbar关于我的活动延伸片段活动 我知道用于使用setSuppoertActionBar toolbar 我们扩展的方法AppCompatActivity代替FragmentActivity但我重写了onMenuItemSel
  • 模型可以“属于”另外两个模型并具有嵌套关系吗?

    一个模型是否可以属于两个模型并具有嵌套关系 即我想要的 class trainer has many appointments end class appointment belong to trainer customer end cla
  • 如何在 Windows 中向 AD 组添加自定义属性?

    我想知道如何编写这个脚本 另外 是否有一个开箱即用的 GUI 工具可以让我做到这一点 您是指扩展 AD 架构时交换添加的 CustomField 属性吗 如果是这样 那么你可以使用ADSIEdit http technet microsof
  • Symfony2 - 自定义错误页面永远不会显示

    我正在尝试自定义 error html twig error403 html twig error404 html twig 和 error500 html twig 到目前为止 我已尝试获取由 a 引起的 error403 html tw
  • RxJava2 - 同步执行调用

    I ve a TestService 我在其中执行异步任务来获取数据 我想等待回复后再继续 public List
  • 使用 fft 查找每个谐波的相位

    我用的是Matlab 我有一个正弦信号 X 放大器 220 频率 50 我添加了 3 个谐波 x1 gt h2 放大器 30 频率 100 相位 30 x2 gt h4 放大器 10 频率 200 相位 50 x3 gt h6 放大器 05