多种频谱校正方法及matlab代码

合集下载

利用Matlab进行频谱分析的方法

利用Matlab进行频谱分析的方法

利用Matlab进行频谱分析的方法引言频谱分析是信号处理和电子工程领域中一项重要的技术,用于分析信号在频率域上的特征和频率成分。

在实际应用中,频谱分析广泛应用于音频处理、图像处理、通信系统等领域。

Matlab是一种强大的工具,可以提供许多功能用于频谱分析。

本文将介绍利用Matlab进行频谱分析的方法和一些常用的工具。

一、Matlab中的FFT函数Matlab中的FFT(快速傅里叶变换)函数是一种常用的频谱分析工具。

通过使用FFT函数,我们可以将时域信号转换为频域信号,并得到信号的频谱特征。

FFT 函数的使用方法如下:```Y = fft(X);```其中,X是输入信号,Y是输出的频域信号。

通过该函数,我们可以得到输入信号的幅度谱和相位谱。

二、频谱图的绘制在进行频谱分析时,频谱图是一种直观和易于理解的展示形式。

Matlab中可以使用plot函数绘制频谱图。

首先,我们需要获取频域信号的幅度谱。

然后,使用plot函数将频率与幅度谱进行绘制。

下面是一个示例:```X = 1:1000; % 时间序列Y = sin(2*pi*10*X) + sin(2*pi*50*X); % 输入信号Fs = 1000; % 采样率N = length(Y); % 信号长度Y_FFT = abs(fft(Y)); % 计算频域信号的幅度谱f = (0:N-1)*(Fs/N); % 频率坐标plot(f, Y_FFT);```通过上述代码,我们可以得到输入信号在频谱上的特征,并将其可视化为频谱图。

三、频谱分析的应用举例频谱分析可以应用于许多实际问题中。

下面将介绍两个常见的应用举例:语音信号分析和图像处理。

1. 语音信号分析语音信号分析是频谱分析的一个重要应用领域。

通过对语音信号进行频谱分析,我们可以探索声波的频率特性和信号的频率成分。

在Matlab中,可以使用wavread 函数读取音频文件,并进行频谱分析。

下面是一个示例:```[waveform, Fs] = wavread('speech.wav'); % 读取音频文件N = length(waveform); % 信号长度waveform_FFT = abs(fft(waveform)); % 计算频域信号的幅度谱f = (0:N-1)*(Fs/N); % 频率坐标plot(f, waveform_FFT);```通过上述代码,我们可以获取语音信号的频谱特征,并将其可视化为频谱图。

利用Matlab绘制正弦信号的频谱图并做相关分析

利用Matlab绘制正弦信号的频谱图并做相关分析

利用Matlab绘制正弦信号的频谱图并做相关分析一、作业要求:1、信号可变(信号的赋值、相位、频率可变);2、采样频率fs可变;3、加各种不同的窗函数并分析其影响;4、频谱校正;5、频谱细化。

二、采用matlab编写如下程序:clear;clf;fs=100;N=1024; %采样频率和数据点数A=20;B=30;C=0.38;n=0:N-1;t=n/fs; %时间序列x=A*sin(2*pi*B*t+C); %信号y=fft(x,N); %对信号进行傅里叶变换yy=abs(y); %求得傅里叶变换后的振幅yy=yy*2/N; %幅值处理f=n*fs/N; %频率序列subplot(3,3,1),plot(f,yy); %绘出随频率变化的振幅xlabel('频率/\itHz');ylabel('振幅');title('图1:fs=100,N=1024');grid on;%两种信号叠加,x=A*sin(2*pi*B*t+C)+2*A*sin(2*pi*1.5*B*t+2.5*C); %信号y=fft(x,N); %对信号进行傅里叶变换yy=abs(y); %求得傅里叶变换后的振幅yy=yy*2/N; %幅值处理f=n*fs/N; %频率序列subplot(3,3,2),plot(f,yy); %绘出随频率变化的振幅xlabel('频率/\itHz');ylabel('振幅');title('图2:fs=100,N=1024,两种信号叠加');grid on;%加噪声之后的图像x=A*sin(2*pi*B*t+C)+28*randn(size(t));y=fft(x,N);yy=abs(y);yy=yy*2/N; %幅值处理subplot(3,3,3),plot(f(1:N/2.56),yy(1:N/2.56));xlabel('频率/\itHz');ylabel('振幅');title('图3:fs=100,N=1024混入噪声');grid on;%改变采样点数N=128N=128;n=0:N-1;t=n/fs; %时间序列x=A*sin(2*pi*B*t+C); %信号y=fft(x,N); %对信号进行傅里叶变换yy=abs(y); %求得傅里叶变换后的振幅yy=yy*2/N; %幅值处理f=n*fs/N; %频率序列subplot(3,3,4),plot(f(1:N/2.56),yy(1:N/2.56)); %绘出随频率变化的振幅xlabel('频率/\itHz');ylabel('振幅');title('图4:fs=100,N=128');grid on;%改变采样频率为200Hz时的频谱fs=400;N=1024;n=0:N-1;t=n/fs;x=A*sin(2*pi*B*t+C); %信号y=fft(x,N); %对信号进行快速傅里叶变换yy=abs(y); %求取傅里叶变换的振幅yy=yy*2/N; %幅值处理f=n*fs/N;subplot(3,3,5),plot(f(1:N/2.56),yy(1:N/2.56)); %绘出随频率变化的振幅xlabel('频率/\itHz');ylabel('振幅');title('图5:fs=400,N=1024');grid on;%加三角窗函数fs=100;N=1024; %采样频率和数据点数n=0:N-1;t=n/fs; %时间序列x=A*sin(2*pi*B*t+C); %信号window=triang(N);%生成三角窗函数x=x.*window';%加窗函数y=fft(x,N); %对信号进行傅里叶变换yy=abs(y); %求得傅里叶变换后的振幅yy=yy*2/N; %幅值处理f=n*fs/N; %频率序列subplot(3,3,6),plot(f(1:N/2.56),2*yy(1:N/2.56)); %绘出随频率变化的振幅xlabel('频率/\itHz');ylabel('振幅');title('图6:fs=100,N=1024,加三角窗函数');grid on;%加海明窗函数后的频谱fs=100;N=1024;n=0:N-1;t=n/fs;x=A*sin(2*pi*B*t+C); %信号window=hamming(N);%生成海明窗函数x=x.*window';%加窗函数y=fft(x,N); %对信号进行快速傅里叶变换yy=abs(y); %求取傅里叶变换的振幅yy=yy*2/N; %幅值处理f=n*fs/N;subplot(3,3,7),plot(f(1:N/2.56),1.852*yy(1:N/2.56)); %绘出随频率变化的振幅xlabel('频率/\itHz');ylabel('振幅');title('图7:fs=100,N=1024,加海明窗函数');grid on;%加汉宁窗函数后的频谱fs=100;N=1024;n=0:N-1;t=n/fs;x=A*sin(2*pi*B*t+C); %信号window=hanning(N);%生成汉宁窗函数x=x.*window';%加窗函数y=fft(x,N); %对信号进行快速傅里叶变换yy=abs(y); %求取傅里叶变换的振幅yy=yy*2/N; %幅值处理f=n*fs/N;subplot(3,3,8),plot(f(1:N/2.56),2*yy(1:N/2.56)); %绘出随频率变化的振幅xlabel('频率/\itHz');ylabel('振幅');title('图8:fs=100,N=1024,加汉宁窗函数');grid on;三、运行结果如下:四、分析与结论:1)从所做图像可以看出,信号的幅值均小于真实值,说明在截断信号时存在泄露。

matlab 计算频谱的命令

matlab 计算频谱的命令

【主题】matlab 计算频谱的命令一、matlab 中的频谱分析在 matlab 中,频谱分析是一种常见的数据处理技术,主要用于分析信号在频域上的特性。

频谱分析可以帮助我们了解信号的频率成分、周期性特征以及信号之间的关系,因此在信号处理、通信系统、音频分析等领域有着广泛的应用。

matlab 提供了丰富的频谱分析函数和命令,通过这些工具我们可以快速、准确地进行频谱分析,并获取有价值的信息。

二、常用的频谱分析命令1. fftfft 是 matlab 中最常用的频谱分析命令之一。

它可以将时域信号转换为频域信号,通过计算信号的傅立叶变换来获取信号的频谱信息。

其基本语法为:Y = fft(X),其中 X 表示输入的时域信号,Y 表示输出的频域信号。

对于一个长度为 N 的输入信号,fft 命令将返回一个长度为 N 的复数数组,其中包含了信号在频域上的幅度和相位信息。

我们可以进一步对这些复数进行振幅谱和相位谱的分析,以获取更详细的频谱特征。

2. periodogramperiodogram 是用于计算信号功率谱密度(PSD)的命令。

它可以帮助我们分析信号在频域上的能量分布情况,从而了解信号的频率成分和能量分布情况。

其基本语法为:Pxx = periodogram(X),其中 X 表示输入的信号。

通过 periodogram 命令,我们可以得到信号在不同频率上的功率谱密度估计值,以及相应的频率坐标。

这些信息对于分析信号的频谱特性非常有帮助,可以用于识别信号的主要频率成分和频率分布规律。

3. spectrogramspectrogram 命令用于计算信号的短时傅立叶变换,并绘制信号的时频谱图像。

它可以帮助我们观察信号在时间和频率上的变化规律,从而发现信号的时变特性和频率变化趋势。

其基本语法为:S = spectrogram(X),其中 X 表示输入的信号。

通过 spectrogram 命令,我们可以得到信号的时频谱图像,其中横轴表示时间,纵轴表示频率,颜色表示信号强度。

频谱校正方法

频谱校正方法

频谱校正方法
温馨提示:文档内容仅供参考
频谱校正是指对频谱信号进行校正以消除信号中的误差或非线性响应。

下面介绍几种常见的频谱校正方法:
线性插值法:该方法适用于频谱信号中的离散点不均匀分布的情况。

线性插值法通过在频率域上的两个离散点之间线性插值,获得一条直线,从而对频谱信号进行插值。

多项式拟合法:该方法适用于频谱信号中的误差具有一定的规律性。

多项式拟合法通过将原始信号拟合成一个多项式函数,从而对频谱信号进行校正。

傅里叶变换法:该方法适用于频谱信号中的非线性响应较为明显的情况。

傅里叶变换法通过将原始信号进行傅里叶变换,将频域中的非线性响应转换为时域中的线性响应,从而对频谱信号进行校正。

平滑法:该方法适用于频谱信号中存在噪声的情况。

平滑法通过对频谱信号进行平滑处理,从而减少噪声对频谱信号的影响。

需要根据实际情况选择适当的频谱校正方法进行使用。

Matlab编程实现FFT变换及频谱分析的程序代码

Matlab编程实现FFT变换及频谱分析的程序代码

Matlab编程实现FFT变换及频谱分析的程序代码内容1.用Matlab产生正弦波,矩形波,以及白噪声信号,并显示各自时域波形图2.进行FFT变换,显示各自频谱图,其中采样率,频率、数据长度自选3.做出上述三种信号的均方根图谱,功率图谱,以及对数均方根图谱4.用IFFT傅立叶反变换恢复信号,并显示恢复的正弦信号时域波形图源程序%*************************************************************** **********%% FFT实践及频谱分析%%*************************************************************** **********%%*************************************************************** **********%%***************1.正弦波****************%fs=100;%设定采样频率N=128;n=0:N-1;t=n/fs;f0=10;%设定正弦信号频率%生成正弦信号x=sin(2*pi*f0*t);figure(1);subplot(231);plot(t,x);%作正弦信号的时域波形xlabel('t');ylabel('y');title('正弦信号y=2*pi*10t时域波形');grid;%进行FFT变换并做频谱图y=fft(x,N);%进行fft变换mag=abs(y);%求幅值f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换figure(1);subplot(232);plot(f,mag);%做频谱图axis([0,100,0,80]);xlabel('频率(Hz)');ylabel('幅值');title('正弦信号y=2*pi*10t幅频谱图N=128');grid;%求均方根谱sq=abs(y);subplot(233);plot(f,sq);xlabel('频率(Hz)');ylabel('均方根谱');title('正弦信号y=2*pi*10t均方根谱');grid;%求功率谱power=sq.^2;figure(1);subplot(234);plot(f,power);xlabel('频率(Hz)');ylabel('功率谱');title('正弦信号y=2*pi*10t功率谱');grid;%求对数谱ln=log(sq);figure(1);subplot(235);plot(f,ln);xlabel('频率(Hz)');ylabel('对数谱');title('正弦信号y=2*pi*10t对数谱');grid;%用IFFT恢复原始信号xifft=ifft(y);magx=real(xifft);ti=[0:length(xifft)-1]/fs;figure(1);subplot(236);plot(ti,magx);xlabel('t');ylabel('y');title('通过IFFT转换的正弦信号波形');grid;%****************2.矩形波****************% fs=10;%设定采样频率t=-5:0.1:5;x=rectpuls(t,2);x=x(1:99);figure(2);subplot(231);plot(t(1:99),x);%作矩形波的时域波形ylabel('y');title('矩形波时域波形');grid;%进行FFT变换并做频谱图y=fft(x);%进行fft变换mag=abs(y);%求幅值f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换figure(2);subplot(232);plot(f,mag);%做频谱图xlabel('频率(Hz)');ylabel('幅值');title('矩形波幅频谱图');grid;%求均方根谱sq=abs(y);figure(2);subplot(233);plot(f,sq);xlabel('频率(Hz)');ylabel('均方根谱');title('矩形波均方根谱');grid;%求功率谱power=sq.^2;figure(2);subplot(234);plot(f,power);xlabel('频率(Hz)');ylabel('功率谱');title('矩形波功率谱');grid;%求对数谱ln=log(sq);figure(2);subplot(235);plot(f,ln);xlabel('频率(Hz)');ylabel('对数谱');title('矩形波对数谱');grid;%用IFFT恢复原始信号xifft=ifft(y);magx=real(xifft);ti=[0:length(xifft)-1]/fs;figure(2);subplot(236);plot(ti,magx);xlabel('t');ylabel('y');title('通过IFFT转换的矩形波波形');grid;%****************3.白噪声****************% fs=10;%设定采样频率t=-5:0.1:5;x=zeros(1,100);x(50)=100000;figure(3);subplot(231);plot(t(1:100),x);%作白噪声的时域波形xlabel('t');ylabel('y');title('白噪声时域波形');grid;%进行FFT变换并做频谱图y=fft(x);%进行fft变换mag=abs(y);%求幅值f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换figure(3);subplot(232);plot(f,mag);%做频谱图xlabel('频率(Hz)');ylabel('幅值');title('白噪声幅频谱图');grid;%求均方根谱sq=abs(y);figure(3);subplot(233);plot(f,sq);xlabel('频率(Hz)');ylabel('均方根谱');title('白噪声均方根谱');grid;%求功率谱power=sq.^2;figure(3);subplot(234);plot(f,power);xlabel('频率(Hz)');ylabel('功率谱');title('白噪声功率谱');grid;%求对数谱ln=log(sq);figure(3);subplot(235);plot(f,ln);xlabel('频率(Hz)');ylabel('对数谱');title('白噪声对数谱');grid;%用IFFT恢复原始信号xifft=ifft(y);magx=real(xifft);ti=[0:length(xifft)-1]/fs;figure(3);subplot(236);plot(ti,magx);xlabel('t');ylabel('y');title('通过IFFT转换的白噪声波形'); grid;。

如何使用Matlab技术进行频谱分析

如何使用Matlab技术进行频谱分析

如何使用Matlab技术进行频谱分析一、引言频谱分析是一种广泛应用于信号处理领域的重要技术,可以帮助我们了解信号的频率成分和能量分布情况。

Matlab作为一种强大的科学计算软件,提供了丰富的函数和工具包,能够方便快捷地进行频谱分析。

本文将介绍如何使用Matlab技术进行频谱分析,从数据处理到结果展示,将为读者提供全面的指导。

二、数据准备与导入首先,我们需要准备一组待分析的信号数据。

这可以是一个来自传感器的实时采集数据,也可以是从文件中读取的离线数据。

Matlab提供了多种数据导入函数,例如`csvread`函数可以导入CSV格式的数据文件,`load`函数可以导入Matlab的二进制数据文件。

三、时域分析在进行频谱分析之前,我们通常需要先对信号进行必要的时域分析。

这包括对信号进行采样、滤波、降噪等处理,以便获得更准确的频谱分析结果。

1. 采样:如果信号是以连续时间形式存在,我们需要首先对其进行采样。

Matlab提供了`resample`函数可以进行信号的采样,可以根据需要进行上采样或下采样操作。

2. 滤波:滤波是常用的信号处理方法之一,可以去除信号中的噪声以及不感兴趣的频率成分。

Matlab提供了多种滤波函数,例如`lowpass`函数可以进行低通滤波,`bandpass`函数可以进行带通滤波。

3. 降噪:在一些实际应用场景中,信号可能受到各种干扰和噪声的影响。

在进行频谱分析之前,我们需要对信号进行降噪处理,以获得准确的频谱结果。

Matlab提供了`denoise`函数可以进行信号的降噪处理,例如小波降噪、基于稀疏表示的降噪等。

四、频谱分析方法频谱分析是指对信号的频率成分进行分析和研究的过程。

常见的频谱分析方法有傅里叶变换、功率谱估计、自相关函数等。

1. 傅里叶变换:傅里叶变换是频谱分析的基础方法之一,可以将信号从时间域转换到频域。

Matlab提供了`fft`函数用于计算离散傅里叶变换(DFT),可以得到信号的频谱图。

利用MATLAB软件对音频信号进行频谱分析与处理

利用MATLAB软件对音频信号进行频谱分析与处理

利用MATLAB软件对音频信号进行频谱分析与处理一、简介频谱分析是通过对信号的频率成分进行分析,它允许我们了解信号的特性,计算信号的能量分布,同时还可以用来定位造成干扰的频率组件,以及检测和分析信号的变化。

MATLAB是一种编程语言和科学计算软件,它可以非常便捷地实现对音频信号的频谱分析和处理。

二、实现方法1.导入音频信号在使用MATLAB进行频谱分析时,首先需要先将音频信号导入MATLAB环境中。

可以使用audioplayer和audioread函数来完成这一步骤,示例代码如下:[audioData, fs] = audioread(‘AudioFile.wav’);player = audioplayer(audioData, fs);play(player);其中audioData表示从wav文件中读取的音频数据,fs表示采样率,player表示存储audioData和fs的audioplayer实例,play函数可以播放音频文件。

2.信号预处理针对所记录的音频信号,需要进行一些基本的信号处理操作,包括去噪、均衡、时域平均等。

去噪可以用MATLAB内置的函数完成,例如:audioData_NoiseRemoved = denoise(audioData,‘meanspectrum’);均衡是指将频谱的一些区域调整到更好的水平,可以用equalizer函数实现:audioData_Equalized = equalizer(audioData, ‘bandwidth’, 0.2);时域平均则可以使用conv函数实现:audioData_Meaned = conv(audioData, [1/N 1/N ... 1/N]);3.频谱分析频谱分析的主要工作是计算信号的谱密度,也就是每一个频率分量的能量。

ds直接校正法 matlab

ds直接校正法 matlab

DS直接校正法Matlab实现一、概述DS直接校正法(DS Digital Str本人ght Correction)是一种针对数字数据的频率校正方法,主要应用于音频处理领域。

Matlab作为一种强大的数学计算工具,在DS直接校正法的实现上具有很大的优势。

本文将介绍DS直接校正法在Matlab中的实现方法,帮助读者了解该方法的原理和实际操作步骤。

二、DS直接校正法原理1. DS直接校正法基本原理DS直接校正法是一种基于频率分析的数字信号校正方法,它通过分析数字信号的波形特征和频率分布,对信号进行频率校正,从而达到去除谐波、杂音等频率扰动的目的。

该方法主要包括计算频谱、寻找主频、校正频率等步骤。

2. DS直接校正法的Matlab实现原理在Matlab中实现DS直接校正法,主要涉及到对信号进行频谱分析、提取主频、制定校正频率等步骤。

通过Matlab的信号处理工具箱和频域分析工具,可以轻松实现DS直接校正法的全部步骤,并且可以直观地展示频率校正前后的效果。

三、DS直接校正法的Matlab实现步骤1. 读取音频数据在Matlab中,可以使用`audioread`函数读取音频文件,得到音频的采样数据和采样率。

2. 频谱分析利用`fft`函数对音频数据进行快速傅里叶变换,得到音频数据的频谱图像。

3. 寻找主频通过分析频谱图像,可以找到主频的位置和强度,从而确定需要校正的频率。

4. 制定校正频率根据主频的位置和强度,制定校正频率的计算方法,可以是简单的线性变换或复杂的频率匹配算法。

5. 频率校正将校正频率应用到音频数据中,实现对频率的直接校正。

6. 效果展示将校正后的音频数据进行频域分析,对比校正前后的频谱图像,展示校正效果。

四、DS直接校正法在Matlab中的应用实例1. 数据准备从外部音频文件读取采样数据,获取音频信号的采样率和波形数据。

2. 频谱分析和主频提取对音频信号进行频谱分析,提取主频的位置和强度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多种频谱校正方法采样间隔归一化成1T ∆=,采样长度为N .这样FFT 离散谱线为0,1)i X i N =-(,相应的频率分辨率2/(1/)N f N ωπ∆=∆=.设FFT 离散谱线局部极高谱线为m (为了数学上简洁,假定从0开始,注意在MATLAB 环境下数组实际操作的是从1开始),记频偏量δωδω=∆.我们需要使用谱线m 和与之相邻一条次高谱线,记这连续两条谱线中左边一条序号为M (当次高谱线在m 左侧时1M m =-,反之M m =).下面列出若干算法的δ计算公式1.加矩形窗的精确谱校正[1]i i iX U jV =+111()sin()()cos()M M M M opt M MV V M U U M K U U ωω+++-∆+-∆=-1211cos()sin()cos()sin()opt M M opt M M K M Z V U M K M Z V U M ωωωωωω++-∆⎡⎤=+⎢∆⎣⎦-∆+∆⎡⎤=+⎢⎥∆+∆⎣⎦2121cos()cos()()Z M Z M M m Z Z ωωωδ∆+∆-∆=+--2.加矩形窗情形,采用解析单频模型的幅值比校正[1,2]11||()||||M M M X M m X X δ++=+-+3.加汉宁窗情形,采用解析单频模型的幅值比校正[1,2]112||||()||||M M M M X X M m X X δ++-=+-+4.加矩形窗情形,采用解析单频模型的复比值校正[3]11Re ()M M M X M m X X δ++⎛⎫=+- ⎪-⎝⎭5.加汉宁窗情形,采用解析单频模型的复比值校正[3]112()M M M MX X M m X X δ+++=+--6.加矩形窗情形,采用解析单频模型的复合复比值校正[3]11Re ()M m M M X M m X X δ++⎛⎫=+- ⎪-⎝⎭11m R m m X X X δ++=-,1111m m L m m m m X X X X X X δ---=-=--0.5)0.5)m L m Rδδδδδ=-++((7.加汉宁窗情形,采用解析单频模型的复合复比值校正[3]112Re ()M M m M M X X M m X X δ++⎛⎫+=+- ⎪-⎝⎭112m m R m m X X X X δ+++=-,1111221m m m m L m m m m X X X X X X X X δ----++=-=--0.5)0.5)m L m Rδδδδδ=-++((8.加矩形窗,Quin 校正[4]11Re()Re(),Re()Re()m m L R m m X X X X αα-+==11L R L R L Rααδδαα==---,, 00 R R L R δδδδδ>>⎧=⎨⎩当且其它9.加汉宁窗,Quin 校正[4]11Re()Re(),Re()Re()m m L R m m X X X X αα-+==212111L R L R L Rααδδαα++==---,, 00 RR L R δδδδδ>>⎧=⎨⎩当且其它References1.Schoukens,J.,R.Pintelon,H.Van Hamme.The interpolated fast Fourier transform:Acomparative study .IEEE Transactions on Instrumentation and Measurement.1992,41(2):226-232.2.谢明,丁康.频谱分析的校正方法.振动工程学报.1994,7(2):172-179.3.陈奎孚,王建立,张森文.频谱校正的复比值法.振动工程学报(已投).2007.4.Quinn, B.G.Estimating frequency by interpolation using Fourier coefficients.IEEETransactions on Signal Processing.1994,42(5):1264-1268.%========================这是调用调试==================DT=1;N=1024;PHI=pi/3;Ampl=1;CiR=11.9;%cycles in recordFreq=CiR/(DT*N);%frequencyTV=[0:N-1];DatVec=Ampl*cos(Freq*TV*2*pi+PHI);FV=fft(DatVec);figuresubplot(2,1,1);plot(TV,DatVec);subplot(2,1,2);plot(abs(FV(1:round(N/2.56))));grid on[MV,MI]=max(abs(FV));%加矩形窗的解析校正--1FreqShift=SpecCorr(FV,MI,N,1);%加矩形窗的解析单频模型校正--2FreqShift=SpecCorr(FV,MI,N,2);%加汉宁窗的解析单频模型校正--3HanDat=DatVec.*hanning(N,'periodic')';FV=fft(HanDat);FreqShift=SpecCorr(FV,MI,N,3);%加矩形窗的解析单频模型校正+复比值法--4FV=fft(DatVec);FreqShift=SpecCorr(FV,MI,N,4);%加汉宁窗的解析单频模型校正+复比值法--5HanDat=DatVec.*hanning(N,'periodic')';FV=fft(HanDat);FreqShift=SpecCorr(FV,MI,N,5);%加矩形窗的解析单频模型校正+复比值法+左右平均--6FV=fft(DatVec);FreqShift=SpecCorr(FV,MI,N,6);%加汉宁窗的解析单频模型校正+复比值法+左右平均--7HanDat=DatVec.*hanning(N,'periodic')';FV=fft(HanDat);FreqShift=SpecCorr(FV,MI,N,7);%加矩形窗的解析单频模型校正+Quinn算法--8FV=fft(DatVec);FreqShift=SpecCorr(FV,MI,N,8);%加汉宁窗的解析单频模型校正+Quinn算法--9HanDat=DatVec.*hanning(N,'periodic')';FV=fft(HanDat);FreqShift=SpecCorr(FV,MI,N,9);===========这是子程序======================%spectrum correction assemble%the sampling interval is1s(or unitary)%Input:SpecVec--Discrte Fourier Spectrum from FFT%PeakIdx--the peak index,noting the matrix in MatLab start from1%TL--the length(or the point number)of the FFT%method--correction method%output:PeakShift--the corrected peak shifting from the peak in discrete%spectrumfunction PeakShift=SpecCorr(SpecVec,PeakIdx,TL,method)%picking up the second highest spectrum lineif(abs(SpecVec(PeakIdx-1))>abs(SpecVec(PeakIdx+1)))IP=[PeakIdx-1,PeakIdx];ShiftCorr=-1;%shift aligning with the PeakIdxelseIP=[PeakIdx,PeakIdx+1];ShiftCorr=0;%shift aligning with the PeakIdxendII=IP(1)-1;%noting that the index of a matrix in MATLAB starts from1,not zero if(method==1)%an analyitic solution for rectangular windowU=real(SpecVec(IP));V=imag(SpecVec(IP));DW=2*pi/TL;KOPT=(sin(II*DW)*(V(2)-V(1))+cos(II*DW)*(U(2)-U(1)))/(U(2)-U(1));Z=V.*(KOPT-cos((IP-1)*DW))./(sin(DW*(IP-1)))+U;Tmp1=(Z(2)*cos(DW*(II+1))-Z(1)*cos(DW*II))/(Z(2)-Z(1));PeakPos=acos(Tmp1)/DW;PeakShift=PeakPos-(PeakIdx-1);elseif(method==2)%based on the analytical-single-tone model for rectangular window PeakShift=abs(SpecVec(IP(2)))/(abs(SpecVec(IP(2)))+abs(SpecVec(IP(1))));PeakShift=PeakShift+ShiftCorr;%shift aligning with the PeakIdxelseif(method==3)%based on the analytical-single-tone model for Hanning window PeakShift=(2*abs(SpecVec(IP(2)))-abs(SpecVec(IP(1))))/(abs(SpecVec(IP(2)))+abs(SpecVec(IP(1) )));PeakShift=PeakShift+ShiftCorr;%shift aligning with the PeakIdxelseif(method==4)%based on the analytical-single-tone model for rectangular window with complex correctionPeakShift=real(SpecVec(IP(2))/(SpecVec(IP(2))-SpecVec(IP(1))));PeakShift=PeakShift+ShiftCorr;%shift aligning with the PeakIdxelseif(method==5)%based on the analytical-single-tone model for Hanning window with complex correctionPeakShift=(2*SpecVec(IP(2))+SpecVec(IP(1)))/(SpecVec(IP(2))-SpecVec(IP(1)));PeakShift=real(PeakShift)+ShiftCorr;%shift aligning with the PeakIdx elseif(method==6)%based on the analytical-single-tone model for rectangular window with complex correction+averagePeakShift=real(SpecVec(IP(2))/(SpecVec(IP(2))-SpecVec(IP(1))));MaxPeakShift=PeakShift+ShiftCorr;%shift aligning with the PeakIdxLeftShift=real(SpecVec(PeakIdx)/(SpecVec(PeakIdx)-SpecVec(PeakIdx-1)))-1;RightShift=real(SpecVec(PeakIdx+1)/(SpecVec(PeakIdx+1)-SpecVec(PeakIdx)));%averagePeakShift=(0.5-MaxPeakShift)*LeftShift+(0.5+MaxPeakShift)*RightShift;elseif(method==7)%based on the analytical-single-tone model for Hanning window with complex correction+average,????PeakShift=(2*SpecVec(IP(2))+SpecVec(IP(1)))/(SpecVec(IP(2))-SpecVec(IP(1)));MaxPeakShift=real(PeakShift)+ShiftCorr;%shift aligning with the PeakIdx LeftShift=(2*SpecVec(PeakIdx)+SpecVec(PeakIdx-1))/(SpecVec(PeakIdx)-SpecVec(PeakIdx-1))-1;RightShift=(2*SpecVec(PeakIdx+1)+SpecVec(PeakIdx))/(SpecVec(PeakIdx+1)-SpecVec(PeakIdx) );%averagePeakShift=(0.5-MaxPeakShift)*LeftShift+(0.5+MaxPeakShift)*RightShift;elseif(method==8)%Quinn method for the rectangular windowa1=real(SpecVec(PeakIdx-1)/SpecVec(PeakIdx));%lefta2=real(SpecVec(PeakIdx+1)/SpecVec(PeakIdx));%rightLeftShift=a1/(1-a1);RightShift=-a2/(1-a2);if(LeftShift>0&RightShift>0)PeakShift=RightShift;elsePeakShift=LeftShift;endelseif(method==9)%Quinn method for the Hanning windowa1=real(SpecVec(PeakIdx-1)/SpecVec(PeakIdx));%lefta2=real(SpecVec(PeakIdx+1)/SpecVec(PeakIdx));%rightLeftShift=(2*a1+1)/(1-a1);RightShift=-(2*a2+1)/(1-a2);if(LeftShift>0&RightShift>0)PeakShift=RightShift;elsePeakShift=LeftShift;endendend。

相关文档
最新文档