五种傅里叶变换的分析(FT、FS、DTFT、DFT、DFS)(基于MATLAB)

五种傅里叶变换

FT傅里叶变换 Fourier Transform
FS傅里叶级数 Fourier Series
DTFT离散时间傅里叶变换 Discrete-time Fourier Transform
DFT离散傅里叶变换 Discrete Fourier Transform
DFS离散傅里叶级数 Discrete Fourier Series

各种信号时域和频域的关系

时域频域
连续 、非周期性非周期性、连续
连续 、周期性非周期性、离散
离散 、非周期性周期性、连续
离散 、周期性周期性、离散

先放一张图让大家理解一下这几种变换相互之间的联系与区别。
在这里插入图片描述
在这篇文章中,我会用MATLAB画图的方式来解释这五种傅里叶变换的区别与联系。

一、(FT)傅里叶变换

在这里插入图片描述
这是傅里叶变换的公式,它可以将一个 以时间t为自变量 的连续的信号 f(t) 转换为 以频率为自变量 的函数 F(jf),该函数是复数形式的。

该公式有三个关键点:

  • f(t) 是一个时域上连续的信号。
  • t 从负无穷到正无穷积分。
  • 频率f 连续,其得到的结果 F(jf) 也为频率域上连续的频谱。

但计算机并不能处理连续的信号,得到的结果也是离散的,而且计算机只能处理有限长度的数据。故计算机不能实现傅里叶变换。

大家都知道一个连续的函数之所以连续,是因为其中每个值之间的间隔为无穷小,离散的信号不管间距多么的小,始终只能无限接近于连续的信号。
那么我们给与这样一个假设
当离散的间隔达到一个非常小的程度,我们就将该离散信号看成是连续信号。
① 将信号f(t)以∆t=0.001s进行采样,由于采样间隔很小,近似看成时域上连续的信号。
② 频率f也取一个∆f=0.001Hz的间隔,由于频率间隔很小,近似看成频率域上连续。

这样我们就可以通过计算机实现傅里叶变换了。

1、

我们产生出一个连续的信号(以0.001s为采样间隔),如下:
在这里插入图片描述
在这里插入图片描述
MATLAB代码:

Dt = 0.001;   %信号采样间隔,s
tlen = 4;     %信号长度,s
t = 0:Dt:tlen;
tsize = tlen/Dt+1;
k = 1;
for i=t
    if i<=2
        y(k) = 0.5*i;
    end
    if i>2
        y(k) = 2-0.5*i;
    end
    k=k+1;
end
plot(t,y);

这里产生了一个三角形状的信号,只有在t=0~4s有值,其余时刻都为0,这样便可以使得傅里叶变换在负无穷到正无穷上积分有意义。

2、

进行傅里叶变换:
在这里插入图片描述
MATLAB代码:

f = -3:0.001:3;     %频率的分辨率0.001Hz,近似代表连续的频谱
num = size(f);
num = num(2);       %保存横坐标频率的个数
ff = 0*ones(1,num); %用来保存计算得到的个频率下的结果
 
counts = 1;
for k1=f
    for k2=1:1:tsize
        ff(counts) = ff(counts)+Dt*y(k2)*exp(-2*pi*1i*k1*t(k2));
    end
    counts=counts+1;
end

plot(f,abs(ff));
xlabel('频率/Hz');
ylabel('频谱密度/F(f)');

该信号为连续信号,变换后的频谱也为连续谱,其纵坐标的值代表频谱密度,并不是真实信号中所含频率成分的幅值的大小

我们得到一个结论:信号是连续、非周期的,其频谱是非周期、连续的

二、(FS)傅里叶级数

傅里叶级数是对周期信号进行频谱展开,故只有周期信号才有傅里叶级数。

1、

对原信号进行周期延拓,变为周期为原信号时间长度 T 的周期信号:


然后对延拓后的信号进行傅里叶级数展开,周期为 T=4s,基频为 f0=1/4 Hz
傅里叶级数公式:
在这里插入图片描述

tlen = 4;
f = -3:1/tlen:3;   %频率的间隔0.25Hz
num = size(f);
num = num(2);     %保存横坐标频率的个数
ff = 0*ones(1,num);  %用来保存计算得到的个频率下的结果
counts = 1;
for k1=f
    for k2=1:1:tsize
        ff(counts) = ff(counts)+1/tlen*Dt*y(k2)*exp(-2*pi*1i*k1*t(k2));
    end
    counts=counts+1;
end
stem(f,abs(ff));
xlabel('频率/Hz');
ylabel('频率幅值/F(f)');

在这里插入图片描述
该频谱为离散频谱,以 f0=1/4Hz 为基频,求得的离散双边频谱。

我们得到一个结论:信号是连续、周期的,其频谱是非周期、离散的

相当于对原来的频谱密度函数进行等间距采样,然后缩减为1/4倍。

原理很简单:
周期延拓相当于原信号与一个梳状函数(单位冲激序列)进行了卷积,而梳状函数的频谱也是一个冲激序列,只不过幅值和周期发生了改变,时域的卷积相当于频域的乘积,所以得到的频谱就是原频谱进行了等间距采样。

放图

三、(DTFT)离散时间傅里叶变换

以上我们遇到的信号都是时域连续的信号,我们都是使用间隔很小的采样来近似连续信号(尽管之前是将信号用非常小的间隔进行划分,相当于间隔无穷小,来近似看成连续的信号,但仍然不是连续的信号)。
这样我们便要对信号真正地进行离散时间采样,采样频率为Fs
我们假设采样频率为 Fs=200Hz ,得到如下的一个离散的序列 x(n)
在这里插入图片描述
这样就将信号在时域上离散化了。
引出离散时间傅里叶变换公式:在这里插入图片描述
得到频谱图,如下(截取了其中一个段):
在这里插入图片描述
可以看到,得到的仍然是一个连续的频谱(f没有离散化)。但是该连续的频谱变为周期性的了,且周期和采样频率有关,周期 Tf=Fs=200Hz

我们得到一个结论:信号是离散、非周期的,其频谱是周期、连续的

四、(DFT)离散傅里叶变换

对该连续的频谱,计算机也要对频率进行离散采样,即频率离散化,因为其频谱是周期的,故只在一个周期 Tf 内进行采样计算即可。
频谱周期为Tf,其中只取一个周期计算,将Tf分成N份。
理论上一个周期内分为多少份都可以,只要得到的频谱能够清楚地反应其变化规律,不失真就行。但要做到这一点,其分成的份数是比较多的。
一般取 N 等于原信号离散采样的个数,N=信号长度tlen*采样频率Fs,故频率采样间隔Tf/N=Tf/(tlen*Fs)=1/tlen Hz
将信号中值为0的部分去掉,信号变为一个有限长的序列x(n),长度为N。

得到的频谱成为离散傅里叶变换公式:
在这里插入图片描述
其中,Tf=Fs=1/∆t,上式化简为:
在这里插入图片描述
其中 ∆t 不过是一个常数,不影响频谱的相对大小,将其归一化为1:
在这里插入图片描述
这便是 离散傅里叶变换(DFT) 的表达式。

下图便是离散傅里叶变换得到的频谱:
在这里插入图片描述
在计算机当中,这是我们最常用的傅里叶变换
但其得到的值只能表示各频率成分幅值的相对大小,并不是信号各频率成分的真正幅值的大小。
想要得到幅值的真正大小,还要进行进一步的变化。

五、(DFS)离散傅里叶级数

在上面,我们通过周期延拓得到了一个周期性的信号,其得到的频谱是一个离散的非周期的频谱。
如果我们对该周期信号进行离散采样,其对应的频率将会进行周期延拓,变成一个离散的周期的频谱;
或者我们对先离散过后的信号进行周期延拓,其对应的频率会被离散采样,也同样变为一个离散的周期的频谱。
我们得到一个结论:信号是离散、周期的,其频谱是周期、离散的

在这里插入图片描述

该公式只与离散傅里叶变换差了一个1/N,该公式得到的值便是信号中各频率成分的幅值的1/2。
1/2的原因在于此处用到的傅里叶级数是复指数形式的傅里叶级数,复指数形式的傅里叶级数与三角函数形式的傅里叶级数相差1/2。

六、如何使用离散傅里叶变换(DFT)?

在这里插入图片描述
1、我们在得到一段信号后,首先得到的信息是该信号的时间长度 T
2、以一定的采样频率 Fs 进行采样,可以得到一个离散序列x(n),其长度为 N=T*Fs
3、x(n)N代入公式,得到一个频率序列 X(k),其长度也为 N,该序列中的值为复数。

我们要做的便是对该序列X(k),进行一定的处理,来得到不同频率的幅值大小。
4、X(k) 频率序列的频率是以 1/T 为间隔的,以此为横坐标。
5、若将频率序列X(k)再除以N,乘以2,然后取前一半数据(因为数据是对称的,只有一半是有用的),便得到各频率所对应的正是幅值大小,以此为纵坐标。
6、画出的图,便是能够反映各频率成分幅值大小的频谱图。

下面使用MATLAB来做一个演示。
使用FFT代替DFT。

快速傅里叶变换FFT只是一种DFT的快速算法,两者得到的结果是完全相同的。

1、得到信号序列。

%定义采样频率、采样点数等
Fs = 1000;          %采样频率
Dt = 1/Fs;          %采样周期
n = 1000;           %采样点数
T = N*Dt;           %采样信号的时间长度
t = (0:(N-1))*Dt;  %离散时间点,以Fs为采样频率

y = 2*cos(2*pi*50*t)+cos(2*pi*30*t); 
%画出时域图
plot(t,y,'r');
xlabel('Time');
ylabel('幅值');
title('时域信号')

在这里插入图片描述
2、对序列进行FFT快速傅里叶变换。

Y = fft(y);     %快速傅里叶变换
f = 0:1/T:Fs;
f = f(1:end-1);   %去掉最后一个频率点
plot(f,abs(Y));

在这里插入图片描述
3、处理。

mag = 2*abs(Y)/N;          %除以N,乘以2plot(f(1:N/2),mag(1:N/2)); %取一半数据显示

在这里插入图片描述

谢谢观看,希望对各位有所帮助!

  • 65
    点赞
  • 396
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
MATLAB中的傅立叶变换是一种非常常用的信号处理方法,可以用于分析信号的频率特征。而尺度变换是指对信号进行缩放以改变其时间尺度,例如将信号放大或缩小。基于MATLAB GUI的傅里叶变换分析的仿真设计可以方便地进行信号处理和分析。 下面是一个简单的MATLAB GUI程序,用于进行傅立叶变换和尺度变换的仿真设计: ```matlab function varargout = FourierTransform(varargin) % FOURIERTRANSFORM MATLAB code for FourierTransform.fig % FOURIERTRANSFORM, by itself, creates a new FOURIERTRANSFORM or raises the existing % singleton*. % % H = FOURIERTRANSFORM returns the handle to a new FOURIERTRANSFORM or the handle to % the existing singleton*. % % FOURIERTRANSFORM('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in FOURIERTRANSFORM.M with the given input arguments. % % FOURIERTRANSFORM('Property','Value',...) creates a new FOURIERTRANSFORM or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before FourierTransform_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to FourierTransform_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help FourierTransform % Last Modified by GUIDE v2.5 19-Aug-2021 12:00:06 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @FourierTransform_OpeningFcn, ... 'gui_OutputFcn', @FourierTransform_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before FourierTransform is made visible. function FourierTransform_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to FourierTransform (see VARARGIN) % Choose default command line output for FourierTransform handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes FourierTransform wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = FourierTransform_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; % --- Executes on button press in load_button. function load_button_Callback(hObject, eventdata, handles) % hObject handle to load_button (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) [file, path] = uigetfile({'*.wav;*.mp3;*.mp4;*.avi','All Audio and Video Files';'*.wav','WAV Files (*.wav)';'*.mp3','MP3 Files (*.mp3)';'*.mp4','MP4 Files (*.mp4)';'*.avi','AVI Files (*.avi)'},'Choose an audio or video file'); if isequal(file,0) || isequal(path,0) return; else [audio, fs] = audioread(fullfile(path,file)); handles.audio = audio; handles.fs = fs; axes(handles.original_audio); plot(audio); xlabel('Time (s)'); ylabel('Amplitude'); title('Original Audio'); guidata(hObject, handles); end % --- Executes on button press in play_button. function play_button_Callback(hObject, eventdata, handles) % hObject handle to play_button (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) sound(handles.audio, handles.fs); % --- Executes on button press in FFT_button. function FFT_button_Callback(hObject, eventdata, handles) % hObject handle to FFT_button (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) audio = handles.audio; fs = handles.fs; L = length(audio); NFFT = 2^nextpow2(L); Y = fft(audio, NFFT)/L; f = fs/2*linspace(0,1,NFFT/2+1); axes(handles.FFT_plot); plot(f, 2*abs(Y(1:NFFT/2+1))); xlabel('Frequency (Hz)'); ylabel('|Y(f)|'); title('Single-Sided Amplitude Spectrum of y(t)'); % --- Executes on button press in scale_button. function scale_button_Callback(hObject, eventdata, handles) % hObject handle to scale_button (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) audio = handles.audio; fs = handles.fs; scale_factor = str2double(get(handles.scale_factor_edit, 'String')); scaled_audio = resample(audio, scale_factor, 1); axes(handles.scaled_audio); plot(scaled_audio); xlabel('Time (s)'); ylabel('Amplitude'); title(['Scaled Audio (' num2str(scale_factor) 'x)']); handles.scaled_audio = scaled_audio; guidata(hObject, handles); function scale_factor_edit_Callback(hObject, eventdata, handles) % hObject handle to scale_factor_edit (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of scale_factor_edit as text % str2double(get(hObject,'String')) returns contents of scale_factor_edit as a double % --- Executes during object creation, after setting all properties. function scale_factor_edit_CreateFcn(hObject, eventdata, handles) % hObject handle to scale_factor_edit (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in scaled_FFT_button. function scaled_FFT_button_Callback(hObject, eventdata, handles) % hObject handle to scaled_FFT_button (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) scaled_audio = handles.scaled_audio; fs = handles.fs; L = length(scaled_audio); NFFT = 2^nextpow2(L); Y = fft(scaled_audio, NFFT)/L; f = fs/2*linspace(0,1,NFFT/2+1); axes(handles.scaled_FFT_plot); plot(f, 2*abs(Y(1:NFFT/2+1))); xlabel('Frequency (Hz)'); ylabel('|Y(f)|'); title('Single-Sided Amplitude Spectrum of y(t) (Scaled)'); ``` 这个GUI程序包括以下组件: - load_button:加载音频文件 - play_button:播放音频文件 - FFT_button:将音频信号进行傅立叶变换,并绘制频谱图 - scale_factor_edit和scale_button:对音频信号进行尺度变换,并绘制缩放后的信号图 - scaled_FFT_button:对缩放后的信号进行傅立叶变换,并绘制频谱图 使用该程序,您可以通过以下步骤进行傅立叶变换和尺度变换的仿真设计: 1. 运行程序,并单击“load_button”按钮以加载音频文件。 2. 单击“play_button”按钮以播放音频文件。 3. 单击“FFT_button”按钮以进行傅立叶变换,并绘制频谱图。 4. 在“scale_factor_edit”文本框中输入缩放因子,并单击“scale_button”按钮以对音频信号进行尺度变换,并绘制缩放后的信号图。 5. 单击“scaled_FFT_button”按钮以对缩放后的信号进行傅立叶变换,并绘制频谱图。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值