基于matlab的傅里叶变换「建议收藏」

基于matlab的傅里叶变换「建议收藏」原文出处例子1作用:使用傅里叶变换找出隐藏在噪声中的信号的频率成分。(指定信号的参数,采样频率为1kHz,信号持续时间为1秒。)由上图可知:从时域中我们很难观察到信号的频率成分。怎么办呢?当然

大家好,又见面了,我是你们的朋友全栈君。

原文出处https://blog.csdn.net/qq_37366291/article/details/79832886

例子1
作用:使用傅里叶变换找出隐藏在噪声中的信号的频率成分。(指定信号的参数,采样频率为1 kHz,信号持续时间为1秒。)

Fs = 1000;            % 采样频率
T = 1/Fs;             % 采样周期
L = 1000;             % 信号长度
t = (0:L-1)*T;        % 时间向量

%%形成一个信号,包含振幅为0.7的50hz正弦信号和振幅为1的120hz正弦信号。
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
X = S + 2*randn(size(t));             %用零均值的白噪声破坏信号,方差为4。


plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')1234567891011121314

这里写图片描述
由上图可知:从时域中我们很难观察到信号的频率成分。怎么办呢?当然使用强大的傅里叶变换。

Y = fft(X);     %计算傅里叶变换,X是加噪后的信号

%%
%计算双边谱P2。然后计算基于P2的单面谱P1和偶值信号长度L。(不太理解。。。)
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

%%
%定义频率域f并绘制单面振幅谱P1。由于增加的噪音,振幅不完全是0.7和1。平均而言,较长的信号产生更好的频率近似。
f = Fs*(0:(L/2))/L;
plot(f,P1)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')123456789101112131415

这里写图片描述

%%
%现在,对原始的,未被损坏的信号进行傅里叶变换,并得到准确的振幅,0.7和1.0。
Y = fft(S);   %S时原始的,没有加噪的信号。
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

plot(f,P1) 
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')1234567891011

这里写图片描述
加上一点自己的理解。这里写图片描述

例子2
作用:利用傅里叶变换,将高斯脉冲从时域转换为频域。

Fs = 100;           % Sampling frequency
t = -0.5:1/Fs:0.5;  % Time vector
L = length(t);      % Signal length

X = 1/(4*sqrt(2*pi*0.01))*(exp(-t.^2/(2*0.01)));

plot(t,X)
title('Gaussian Pulse in Time Domain')
xlabel('Time (t)')
ylabel('X(t)')12345678910

这里写图片描述

%%
%要使用fft函数将信号转换为频域,首先要确定一个新的输入长度,该输入长度是原信号长度的下一个2次方。
%为了提高fft的性能,这将使信号X以尾随零的形式出现。

n = 2^nextpow2(L);
Y = fft(X,n);
f = Fs*(0:(n/2))/n;
P = abs(Y/n);

plot(f,P(1:n/2+1))
title('Gaussian Pulse in Frequency Domain')
xlabel('Frequency (f)')
ylabel('|P(f)|')12345678910111213

这里写图片描述

例子3余弦波
比较时域和频域的余弦波。指定信号的参数,采样频率为1kHz,信号持续时间为1秒。

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sampling period
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector

x1 = cos(2*pi*50*t);          % First row wave
x2 = cos(2*pi*150*t);         % Second row wave
x3 = cos(2*pi*300*t);         % Third row wave

X = [x1; x2; x3];

for i = 1:3
    subplot(3,1,i)
    plot(t(1:100),X(i,1:100))
    title(['Row ',num2str(i),' in the Time Domain'])
end12345678910111213141516

1

n = 2^nextpow2(L);
dim = 2;
Y = fft(X,n,dim);
P2 = abs(Y/n);
P1 = P2(:,1:n/2+1);
P1(:,2:end-1) = 2*P1(:,2:end-1);
for i=1:3
    subplot(3,1,i)
    plot(0:(Fs/n):(Fs/2-Fs/n),P1(i,1:n/2))
    title(['Row ',num2str(i), ' in the Frequency Domain'])
end1234567891011

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154749.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • journalctl工具基础介绍

    journalctl工具基础介绍journalctl工具是CentOS-7才有的工具Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件/etc/systemd/journald.confjournalctl用法查看所有日志(默认情况下,只保存本次启动的日志)journalctl查看内核日志(不显示应用日志)journalctl-k查看系统本次启动的日志

  • 雷柏 V500PRO Win键失效「建议收藏」

    雷柏 V500PRO Win键失效「建议收藏」之前买了一个雷柏V500PRO机械键盘玩游戏,但是2020年国庆后再没有玩过。最近在使用键盘的过程中,发现Win键失效,然后开始找原因。网上很多是在任务管理器、注册表之类的,总感觉不属于我的问题范围。在博客的评论区看到一个关于机械键盘的评论,引起很多人的共鸣,感觉和我遇到的问题应该一样。接着再搜一下关于雷柏V500Win键失效,找到并解决。其他机械键盘,自己搜索。对于雷柏V500PRO,Win键控制快捷键:Fn+Win键。…

  • webstorm激活码2021[最新免费获取]

    (webstorm激活码2021)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • isnotempty和isnotnull_was not iterable

    isnotempty和isnotnull_was not iterable先看看isEmpty和isBlank  从效果来看,当a=””,字符中有空格时,IsEmpty是算他不为空的本质上讲:isEmpty等价于str==null||str.length==0isBlank等价于str==null||str.length==0||str.trim().length==0我们再来看非空:is…

  • mysql 新特性之geometry

    mysql 新特性之geometry

  • c#窗体怎么居中_窗口居中

    c#窗体怎么居中_窗口居中窗体始终居桌面中央显示,需要考虑以下两个方面:(1).窗体距离桌面左部边缘与桌面的宽度以及自身宽度的判断;(2).窗体距离桌面上边缘与桌面的高度以及自身高度的判断下面用代码一一实现,当然这都是在窗体加载时完成this.Left=Screen.PrimaryScreen.Bounds.Width/2-this.Width/2;//桌面的宽度的一半减去自身宽的的一半this…….

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号