MATLAB与Python中的快速傅里叶变换频谱分析

devtools/2025/1/15 17:05:27/

MATLAB与Python中的快速傅里叶变换频谱分析

PythonMATLAB都可以方便地实现FFT频谱分析

Python Code

python"># -*- coding: utf-8 -*- 
"""
@File    :   python_fft.py
@Time    :   2025/01/12 19:46:39
@Version :   
@Desc    :   频谱分析——FFT
"""import numpy as np                              # 使用numpy库中的fft
import matplotlib.pyplot as plt                 # 绘制图像支持from scipy.signal import butter, filtfilt       # 信号处理: 滤波# 生成信号
fs = 1000  # 采样频率 (Hz) 大于奈奎斯特采样频率# 生成等间隔时间向量, 包含fs个等间隔时间点, 并且不包含最后一个点
# 设置endpoint=False可以确保时间向量的长度与采样点数fs一致
t = np.linspace(0, 1, fs, endpoint=False)       # 时间向量 (1秒)
f1 = 50  # 信号频率 (Hz)
f2 = 120  # 信号频率 (Hz)
signal = 0.7 * np.sin(2 * np.pi * f1 * t) + 1.0 * np.sin(2 * np.pi * f2 * t)  # 合成信号# 添加噪声
noise = 0.5 * np.random.normal(size=len(t))     # 标准正态分布的噪声
signal += noise# 计算 FFT
n = len(signal)  # 信号长度
fft_result = np.fft.fft(signal)  # FFT 计算
frequencies = np.fft.fftfreq(n, d=1/fs)  # 频率向量# 取正频率部分 截取
positive_freq = frequencies[:n//2]      
magnitude = np.abs(fft_result[:n//2])  # 取幅值# 绘制原始信号图像
plt.figure(figsize=(10, 6))
plt.plot(t, signal)
plt.title('Original Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.grid()
plt.show()# 绘制频谱图
plt.figure(figsize=(10, 6))
plt.plot(positive_freq, magnitude)
plt.title('Spectrum Analysis (FFT)')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.grid()
plt.show()# 滤波处理# 设计低通滤波器
def butter_lowpass(cutoff, fs, order=5):nyquist = 0.5 * fsnormal_cutoff = cutoff / nyquistb, a = butter(order, normal_cutoff, btype='low', analog=False)return b, adef lowpass_filter(data, cutoff, fs, order=5):b, a = butter_lowpass(cutoff, fs, order=order)y = filtfilt(b, a, data)  # 零相位滤波return y# 应用低通滤波器
cutoff = 80  # 截止频率 (Hz)
filtered_signal = lowpass_filter(signal, cutoff, fs)# 绘制滤波后波形图
plt.figure(figsize=(10, 6))
plt.plot(t, filtered_signal, label='Filtered Signal')
plt.title('Filtered Signal (Lowpass)')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid()
plt.legend()
plt.show()

MATLAB Code

matlab">
% 编码格式 : ---> -*- utf-8 -*-
% @Time       : 2025-01-12 19:46:44
% @Author     : 不说(bushuo)
% @Contact    : 3513566868@qq.com
% Description : % 生成信号
fs = 1000;  % 采样频率 (Hz)
t = 0:1/fs:1-1/fs;  % 时间向量 (1秒)
f1 = 50;  % 信号频率 (Hz)
f2 = 120;  % 信号频率 (Hz)
signal = 0.7 * sin(2 * pi * f1 * t) + 1.0 * sin(2 * pi * f2 * t);  % 合成信号% 添加噪声
noise = 0.5 * randn(size(t));
signal = signal + noise;                         % matlab 不支持 += 这种语法% 计算 FFT
n = length(signal);  % 信号长度
fft_result = fft(signal);  % FFT 计算
frequencies = (0:n-1) * (fs/n);  % 频率向量% 取正频率部分
positive_freq = frequencies(1:n/2);
magnitude = abs(fft_result(1:n/2));  % 取幅值% 绘制原始信号图像
figure;
plot(t, signal);
title('Original Signal');
xlabel('Time (s)');
ylabel('Amplitude');
grid on;% 绘制频谱图
figure;
plot(positive_freq, magnitude);
title('Spectrum Analysis (FFT)');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
grid on;% 滤波处理% 设计低通滤波器
cutoff = 80;  % 截止(截断)频率 (Hz)
order = 5;  % 滤波器阶数
[b, a] = butter(order, cutoff/(fs/2));  % 巴特沃斯低通滤波器% 应用低通滤波器
filtered_signal = filtfilt(b, a, signal);  % 零相位滤波% 绘制滤波后信号
figure();
subplot(3, 1, 3);
plot(t, filtered_signal);
title('Filtered Signal (Lowpass)');
xlabel('Time [s]');
ylabel('Amplitude');
grid on;

程序运行结果截图(以Python为例)

原始信号

频谱分析

滤波后信号

Simulink of MATLAB

连接图

频谱分析结果

参考链接

频谱分析-FFT之后的那些事情-CSDN博客


http://www.ppmy.cn/devtools/150354.html

相关文章

ue5 蒙太奇,即上半身动画和下半身组合在一起,并使用。学习b站库得科技

本文核心 正常跑步动画端枪动画跑起来也端枪 正常跑步动画 端枪动画的上半身 跑起来也端枪 三步走: 第一步制作动画蒙太奇和插槽 第二步动画蓝图选择使用上半身动画还是全身动画,将上半身端枪和下半身走路结合 第三步使用动画蒙太奇 1.开始把&a…

搭建k8s集群

由于格式和图片解析问题,为了更好体验,可前往 阅读原文 本文带着大家按照官方文档进行k8s搭建,环境是基于arm架构centos7.9的虚拟机环境进行的,如果你使用的是非ARM架构的系统,仍然可以参考文章指导,而涉及…

为什么在二维卷积操作中,将宽度(W)维度放在高度(H)之前会破坏空间局部性原则,并影响缓存性能

空间局部性原则 空间局部性指的是程序倾向于访问与最近访问过的内存位置接近的内存位置。对于深度学习模型中的张量数据,这意味着当处理图像或特征图时,如果能够连续地访问相邻像素的数据,那么可以最大化利用CPU/GPU缓存,因为缓存…

机器学习特征重要性之feature_importances_属性与permutation_importance方法

一、feature_importances_属性 在机器学习中,分类和回归算法的 feature_importances_ 属性用于衡量每个特征对模型预测的重要性。这个属性通常在基于树的算法中使用,通过 feature_importances_ 属性,您可以了解哪些特征对模型的预测最为重要…

算法(二)——一维差分、等差数列差分

文章目录 一维差分、等差数列差分一维差分例题:航班预订统计 等差数列差分例题:三步必杀例题:Lycanthropy 一维差分、等差数列差分 一维差分 差分解决的是 区间修改(更新)问题,特别是多次区间修改问题&…

Scala语言的网络编程

Scala语言的网络编程 引言 网络编程是指通过网络进行数据通信的程序设计。随着互联网的飞速发展,网络编程已经成为现代应用开发中不可或缺的一部分。在众多编程语言中,Scala凭借其强大的功能与灵活性逐渐受到开发者的青睐。由于其兼容Java的特性&#…

TCP__滑动窗口__拥塞控制

目录 1. 滑动窗口1.1 滑动窗口在哪里?1.2 如何理解滑动窗口1.3 滑动窗口的大小会变化吗?1.4 其它问题 2. 拥塞控制2.1 拥塞避免算法2.1.1 怎么理解拥塞窗口2.1.2 避免拥塞算法(慢启动)的思想2.1.3 慢启动的阈值2.1.4 总结&#xf…

iOS - Method Swizzling

让我详细总结一下 Method Swizzling 的使用和注意事项: 1. 基本实现 // 基本的 Method Swizzling 实现 implementation UIViewController (Tracking) (void)load {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{// 1. 获取原始方法和替换方法…