傅里叶变换—信号观测时长和频率分辨率

博客围绕傅里叶变换展开,重点探讨信号观测时长和频率分辨率的关系,并进行验证,还给出了MATLAB代码辅助说明。

傅里叶变换—信号观测时长和频率分辨率

前言

在这里插入图片描述


一、开始验证

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


附录

MATLAB代码:

%% observe time T and frequency resolution verified
f1 = 1;    %the frequency of child signal 1 
f2 = 1.5;    %the frequency of child signal 2       Unit Hz
Fs = 50;   %sampling rate , Unit Hz
delta_t = 1/Fs;
% t = 0:delta_t:1-delta_t;      %the total time length is 1s,   contains 1 peroid of singal 1 and 1.5 peiod of singal 2
t = 0:delta_t:2-delta_t;      %the total time length is 2s,   contains 2 peroid of singal 1 and 3 peiod of singal 2
s1 = sin(2*pi*f1.*t);    %child signal 1
s2 = sin(2*pi*f2.*t);    %child signal 2
s  = s1 + s2;            %signal;
N = length(t);    %signal length and frequency axis length;
fft_s1 = fft(s1,N);       %fft of child signal 1
fft_s2 = fft(s2,N);       %fft of child signal 2
fft_s = fft(s,N);         %fft of signal
delta_f = Fs/N;       %resolution of frequncy
axis_f = (0:N-1)*delta_f;   %frequency axis
figure(1);
subplot(2,2,1)
plot(t,s1);             %plot signal 1
hold on
plot(t,s2,'-');         %plot signal 2
xlabel('time    s');
ylabel('signal');
title('time domain wave');
legend('child signal 1','child signal 2');
subplot(2,2,3)
plot(axis_f, abs(fft_s1));       %spectrum of signal 1;
hold on
plot(axis_f, abs(fft_s2),'-');       %spectrum of signal 2;
xlabel('frequency   Hz');
ylabel('fft result');
title('observation time 1s');
legend('child signal 1','child signal 2');


subplot(2,2,2)
plot(t,s);             %plot signal
xlabel('time    s');
ylabel('signal');
title('time domain wave');
subplot(2,2,4)
plot(axis_f, abs(fft_s));       %spectrum of signal 1;
xlabel('frequency   Hz');
ylabel('fft result');
title('observation time 1s');






% %separately observe the spectrum of signal that not full period
% f1 = 1;    %the frequency of child signal 1 
% f2 = 1.5;    %the frequency of child signal 2       Unit Hz
% Fs = 50;   %sampling rate , Unit Hz
% delta_t = 1/Fs;
% % t = 0:delta_t:1-delta_t;      %the total time length is 1s,   contains 1 peroid of singal 1 and 1.5 peiod of singal 2
% t = 0:delta_t:2-delta_t;      %the total time length is 2s,   contains 2 peroid of singal 1 and 3 peiod of singal 2
% s1 = sin(2*pi*f1.*t);    %child signal 1
% s2 = sin(2*pi*f2.*t);    %child signal 2
% s  = s1 + s2;            %signal;
% N = 500000;        %fft number in order to observe more detailed
% fft_s1 = fft(s1,N);       %fft of child signal 1
% fft_s2 = fft(s2,N);       %fft of child signal 2
% fft_s = fft(s,N);         %fft of signal
% delta_f = Fs/N;       %resolution of frequncy
% axis_f = (0:N-1)*delta_f;   %frequency axis
% figure(1);
% subplot(2,2,1)
% plot(t,s1);             %plot signal 1
% hold on
% plot(t,s2,'-');         %plot signal 2
% xlabel('time    s');
% ylabel('signal');
% title('time domain wave');
% legend('child signal 1','child signal 2');
% subplot(2,2,3)
% plot(axis_f, abs(fft_s1));       %spectrum of signal 1;
% hold on
% plot(axis_f, abs(fft_s2),'-');       %spectrum of signal 2;
% xlabel('frequency   Hz');
% ylabel('fft result');
% title('observation time 1s');
% legend('child signal 1','child signal 2');
% 
% 
% subplot(2,2,2)
% plot(t,s);             %plot signal
% xlabel('time    s');
% ylabel('signal');
% title('time domain wave');
% subplot(2,2,4)
% plot(axis_f, abs(fft_s));       %spectrum of signal 1;
% xlabel('frequency   Hz');
% ylabel('fft result');
% title('observation time 1s');
### 快速傅里叶变换与短时傅里叶变换的区别及其在信号处理EEG数据分析中的应用 #### 1. 快速傅里叶变换 (Fast Fourier Transform, FFT) 快速傅里叶变换是一种高效的计算离散傅里叶变换(DFT)的算法。相比于直接实现DFT所需的 \(O(N^2)\) 复杂度,FFT将其降低至 \(O(N \log N)\),极大地提高了效率[^1]。FFT主要用于将整个信号从时域转换到频域,适合分析平稳信号的整体频率组成。 然而,当应用于非平稳信号(如EEG数据),FFT无法揭示信号随时间变化的频率特性。这是因为FFT假定输入信号在整个观测期间是稳定的,而EEG信号往往具有瞬变性复杂的时间依赖性[^3]。 ```python import numpy as np def fast_fourier_transform(signal): """ 使用 NumPy 实现快速傅里叶变换。 :param signal: 输入的一维信号数组 :return: 频率对应的幅值 """ N = len(signal) yf = np.fft.fft(signal) xf = np.fft.fftfreq(N)[:N//2] return xf, abs(yf[:N//2]) ``` --- #### 2. 短时傅里叶变换 (Short-Time Fourier Transform, STFT) 短时傅里叶变换通过滑动窗口的方式对信号进行分段,并对每一段分别执行FFT操作。这样可以获得信号在不同时间片段上的频率分布情况,从而形成一种二维表示形式——时频图[^4]。 STFT的关键在于窗口的选择:较宽的窗口提供了更高的频率分辨率但降低了时间分辨率;相反,较窄的窗口则增强了时间分辨能力却削弱了频率细节。这种折衷是由海森堡不确定性原理决定的。 ```python from scipy.signal import stft def short_time_fourier_transform(signal, sampling_rate=1000, window_size=256, overlap_ratio=0.5): """ 使用 SciPy 实现短时傅里叶变换。 :param signal: 输入的一维信号数组 :param sampling_rate: 采样率,默认为 1000 Hz :param window_size: 窗口大小,默认为 256 点 :param overlap_ratio: 窗口重叠比例,默认为 0.5 :return: 频率轴、时间轴幅度矩阵 """ noverlap = int(window_size * overlap_ratio) frequencies, times, Zxx = stft(signal, fs=sampling_rate, nperseg=window_size, noverlap=noverlap) return frequencies, times, np.abs(Zxx) ``` --- #### 3. 主要区别总结 | 特性 | 快速傅里叶变换 (FFT) | 短时傅里叶变换 (STFT) | |-----------------------|--------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------| | **核心功能** | 将整个信号一次性从时域映射到频域 | 提供信号在不同时刻的局部频谱信息 | | **适用场景** | 平稳信号的整体频率分析 | 非平稳信号的时间-频率联合分析 | | **计算复杂度** | 较低 (\(O(N \log N)\)) | 较高 (取决于窗口数量尺寸) | | **时间分辨率** | 不支持 | 支持,由窗口宽度控制 | | **频率分辨率** | 高 | 取决于窗口长度,越长越好 | | **典型用途** | 功率谱密度估计、谐波检测 | EEG 数据分析、语音识别 | --- #### 4. 在EEG数据分析中的具体表现 对于EEG信号来说,由于其本质上是非平稳的,因此STFT相比单纯的FFT更具优势。例如,在研究脑电节律(alpha波、beta波等)如何随着时间发生变化时,STFT可以通过绘制时频图来直观展示这些动态模式[^5]。 不过需要注意的是,如果仅关注全局性的能量分配或固定频率带的能量贡献,则可以直接利用FFT完成任务,无需额外考虑时间维度的影响。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值