傅里叶变换的应用,matlab程序,C语言程序

合集下载

matlab中的傅里叶变换

matlab中的傅里叶变换

matlab中的傅里叶变换Matlab中的傅里叶变换是一种数学工具,用于将一个信号从时域转换到频域。

它是一种广泛应用于信号处理、图像处理、通信系统等领域的重要技术。

在Matlab中,傅里叶变换可以通过内置函数fft和ifft来实现。

fft函数用于计算离散傅里叶变换(DFT),而ifft函数用于计算离散傅里叶逆变换(IDFT)。

傅里叶变换在Matlab中的使用步骤如下:1. 准备信号数据,将待变换的信号存储在一个向量中,可以是时间域的信号序列。

2. 应用fft函数,使用fft函数对信号进行傅里叶变换,得到频域表示。

3. 可选操作,对频域表示进行幅度谱和相位谱的计算,以及其他的频谱分析操作。

4. 应用ifft函数,如果需要,可以使用ifft函数对频域表示进行逆变换,将信号恢复到时域。

需要注意的是,傅里叶变换得到的频域表示是对称的,通常只需要使用一半的频域数据进行分析。

此外,Matlab中还提供了其他相关的函数,如fftshift和ifftshift,用于对频域数据进行平移操作。

傅里叶变换在信号处理中有广泛的应用,例如:1. 频谱分析,可以通过傅里叶变换将信号从时域转换到频域,进而分析信号的频谱特性,如频率成分、频谱密度等。

2. 滤波器设计,可以在频域上设计滤波器,通过傅里叶变换将滤波器的频率响应转换到时域,实现对信号的滤波操作。

3. 图像处理,可以利用傅里叶变换对图像进行频域滤波、图像增强等操作,如去除噪声、边缘检测等。

总结起来,Matlab中的傅里叶变换是一种强大的信号处理工具,通过将信号从时域转换到频域,可以实现频谱分析、滤波器设计、图像处理等应用。

傅里叶变换c程序

傅里叶变换c程序

傅里叶变换c程序傅里叶变换是一种用于分析和处理信号的重要数学工具,广泛应用于信号处理、图像处理、通信系统等领域。

在数学上,傅里叶变换可以将一个时域上的连续或离散信号转换为频域上的连续或离散信号,从而提供了一种将信号从时域转换为频域表示的方法。

在计算机科学中,傅里叶变换也有很大的应用。

通过使用傅里叶变换算法,可以对信号进行频谱分析,提取信号的频率成分,并在频域上进行滤波、去噪等处理。

傅里叶变换的计算可以使用多种方法,包括连续傅里叶变换(FFT)和离散傅里叶变换(DFT)。

为了实现傅里叶变换的计算,可以使用C语言编写相应的程序。

下面是一个简单的傅里叶变换C程序的示例:```c#include <stdio.h>#include <stdlib.h>#include <math.h>#define PI 3.14159265typedef struct {double real;double imag;} Complex;void fft(Complex* x, int N) {if (N <= 1) {}Complex* even = (Complex*) malloc(N/2 * sizeof(Complex)); Complex* odd = (Complex*) malloc(N/2 * sizeof(Complex)); for (int i = 0; i < N/2; i++) {even[i] = x[2*i];odd[i] = x[2*i + 1];}fft(even, N/2);fft(odd, N/2);for (int k = 0; k < N/2; k++) {Complex t;double angle = -2 * PI * k / N;t.real = cos(angle) * odd[k].real + sin(angle) * odd[k].imag; t.imag = cos(angle) * odd[k].imag - sin(angle) * odd[k].real; x[k].real = even[k].real + t.real;x[k].imag = even[k].imag + t.imag;x[k + N/2].real = even[k].real - t.real;x[k + N/2].imag = even[k].imag - t.imag;}free(even);}int main(void) {int N = 8;Complex* x = (Complex*) malloc(N * sizeof(Complex));// 初始化输入信号for (int i = 0; i < N; i++) {x[i].real = i;x[i].imag = 0;}fft(x, N);printf("傅里叶变换结果:\n");for (int i = 0; i < N; i++) {printf("X[%d] = %.2f + %.2fi\n", i, x[i].real, x[i].imag);}free(x);return 0;}```该程序演示了如何通过C代码实现傅里叶变换。

傅里叶在c语言中的使用

傅里叶在c语言中的使用

傅里叶在c语言中的使用傅里叶变换是一种在信号处理、图像处理等领域具有重要应用的算法。

它可以帮助我们将复杂的信号分解成一系列简单的正弦和余弦函数的叠加,从而更好地分析信号的频率特性。

在C语言中,傅里叶变换有着广泛的应用,下面我们将介绍傅里叶变换的基本概念、实现方法以及应用场景。

一、傅里叶变换的基本概念傅里叶变换是一种将时间域或空间域的信号转换为频域信号的数学方法。

其基本原理是将一个复杂的信号分解成无数个简单的正弦和余弦函数的叠加,这种叠加称为傅里叶级数。

在实际应用中,为了减少计算量,通常只取级数的前几项进行计算。

傅里叶变换的数学表达式如下:X(f) = ∫(-∞,∞) x(t) * e^(-jωt) dt其中,x(t)表示时域信号,X(f)表示频域信号,ω表示角频率,j表示虚数单位。

二、傅里叶变换在C语言中的实现方法1.离散傅里叶变换(DFT)离散傅里叶变换是傅里叶变换的一种离散形式,适用于离散信号的处理。

在C语言中,可以使用以下步骤实现DFT:(1)预处理:对输入信号进行窗函数处理,以减少频谱泄漏和旁瓣干扰。

(2)计算:按照DFT的计算公式,对输入信号的每个样本进行傅里叶变换。

(3)后处理:对变换结果进行幅度谱和相位谱的计算,并进行归一化处理。

2.快速傅里叶变换(FFT)快速傅里叶变换是一种高效计算离散傅里叶变换的方法,其时间复杂度为O(n log n)。

在C语言中,可以使用以下步骤实现FFT:(1)初始化:根据输入信号的长度,构建FFT递归函数。

(2)基2递归:按照FFT递归函数,对输入信号进行分组,并计算每组的傅里叶变换结果。

(3)合并:将每组的傅里叶变换结果合并,得到最终的傅里叶变换结果。

三、傅里叶变换的应用场景傅里叶变换在信号处理、图像处理等领域具有广泛的应用,如音频信号分析、图像滤波、模式识别等。

通过傅里叶变换,我们可以更好地分析信号的频率特性,从而为后续的处理和分析提供便利。

四、C语言实现傅里叶变换的实战案例以下是一个简单的C语言实现离散傅里叶变换的示例:```c#include <stdio.h>#include <stdlib.h>#include <math.h>void fft(float *in, float *out, int n) {// 基2递归实现FFT}int main() {int n = 8; // 采样点数float x[] = {1, 1, 1, 0, 0, 0, 0, 0}; // 输入信号float x_fft[n]; // 傅里叶变换结果fft(x, x_fft, n);// 输出傅里叶变换结果for (int i = 0; i < n; i++) {printf("x[%d] = %f", i, x_fft[i]);}return 0;}```五、总结与展望本文介绍了傅里叶变换在C语言中的基本概念、实现方法和应用场景。

matlab中进行傅里叶变换

matlab中进行傅里叶变换

matlab中进行傅里叶变换# MATLAB中的傅里叶变换及应用## 引言傅里叶变换是信号处理领域中一项重要的数学工具,广泛应用于信号分析、图像处理、通信等领域。

MATLAB作为一种高效的科学计算软件,提供了强大的傅里叶变换工具,使得用户能够方便地进行信号频谱分析和处理。

本文将介绍MATLAB中傅里叶变换的基本概念、函数使用方法,并结合实例展示其在信号处理中的应用。

## 1. 傅里叶变换的基本概念### 1.1 时域与频域傅里叶变换是将时域信号转换到频域的一种数学工具。

在时域中,信号是关于时间的函数;而在频域中,信号则是关于频率的函数。

通过傅里叶变换,我们能够将信号在时域和频域之间进行转换,从而更好地理解信号的特性。

### 1.2 连续与离散傅里叶变换MATLAB中的傅里叶变换涵盖了连续和离散两种情况。

对于连续信号,可以使用`fft`函数进行变换;对于离散信号,可以使用`fft`函数进行快速傅里叶变换。

这两种情况下,变换的结果分别为连续频谱和离散频谱。

## 2. MATLAB中的傅里叶变换函数MATLAB提供了丰富的傅里叶变换函数,包括`fft`、`ifft`、`fft2`等。

这些函数可以适用于不同类型的信号,如一维信号、二维信号等。

以下是其中一些常用函数的简要介绍:### 2.1 `fft`函数`fft`函数用于计算一维离散傅里叶变换。

其基本语法为:```matlabY = fft(X)```其中,`X`为输入的离散信号,而`Y`则为变换后的频谱。

### 2.2 `ifft`函数`ifft`函数用于计算一维离散傅里叶反变换。

其基本语法为:```matlabX = ifft(Y)```其中,`Y`为输入的频谱,而`X`则为反变换后的信号。

### 2.3 `fft2`函数对于二维信号,可以使用`fft2`函数进行二维离散傅里叶变换。

其基本语法为:```matlabY = fft2(X)```同样,`X`为输入的二维信号,而`Y`则为变换后的二维频谱。

matlab自己写傅里叶变换程序

matlab自己写傅里叶变换程序

matlab自己写傅里叶变换程序傅里叶变换是一种重要的数学工具,广泛应用于信号处理、图像处理、通信等领域。

它可以将一个信号在频域和时域之间进行转换,帮助我们理解信号的频谱特性。

在本文中,我将介绍如何使用Matlab编写傅里叶变换程序,以及一些相关的应用。

我们需要明确傅里叶变换的定义和公式。

傅里叶变换可以将一个连续时间的信号分解为多个不同频率的正弦和余弦函数的叠加。

在Matlab中,可以使用fft函数进行傅里叶变换。

具体步骤如下:1. 准备信号数据:首先,我们需要准备一个信号数据。

这可以是一个连续时间的信号,也可以是一个离散时间的信号。

可以通过输入一组数据来表示信号。

2. 进行傅里叶变换:使用fft函数对信号进行傅里叶变换。

该函数会返回一个复数数组,表示信号在频域中的幅度和相位信息。

3. 绘制频谱图:使用plot函数将频域信息绘制成频谱图。

这可以帮助我们直观地理解信号的频率分布情况。

4. 反变换:如果需要将傅里叶变换后的频域信号重新转换回时域信号,可以使用ifft函数进行反变换。

除了基本的傅里叶变换,Matlab还提供了一些相关的函数和工具箱,例如快速傅里叶变换(FFT)、离散傅里叶变换(DFT)、傅里叶级数等。

这些工具可以帮助我们更方便地处理和分析信号。

傅里叶变换在信号处理中有着广泛的应用。

例如,我们可以使用傅里叶变换对音频信号进行频谱分析,以便了解音频中各个频率分量的贡献。

另外,傅里叶变换还可以用于图像处理,例如图像压缩和滤波等方面。

总结起来,Matlab提供了丰富的函数和工具箱,可以帮助我们进行傅里叶变换及相关的信号处理任务。

通过编写傅里叶变换程序,我们可以更好地理解信号在频域和时域之间的转换关系,以及信号的频谱特性。

这对于许多科学研究和工程应用都具有重要意义。

傅里叶变换在matlab中应用123

傅里叶变换在matlab中应用123

傅里叶变换在matlab 中应用一、实验目的(1)了解并会熟练计算傅里叶变换; (2)学会在matlab 中运行傅里叶变换;(3)能熟练地绘出频谱图,与matlab 中的频谱图进行比较;二、实验原理1、傅里叶变换的定义非周期信号的频谱(即傅里叶变换)是周期信号的频谱(傅里叶级数)当∞→1T 时的极限。

设周期信号)(t f 展开成复指数形式的傅里叶级数为 tjnw n enw F t f 1)()(1∑∞-∞==⎰-=2211111)(1)(T T t jnw dt e t f T nw F (两边同时乘以1T )得⎰-==221111111)()(2)(T T tjnw dt et f w nw f T nw F π当∞→1T 时,对上式两边求极限得⎰-∞→∞→=221111111)(lim )(2lim T T tjnw T T dt et f w nw f π(2-38)上式左边,当∞→1T 时,如前所述,→11/)(w nw F 有限值,并且成为一个连续得频率函数,即频谱密度函数,用)(w F 表示为11)(2lim )(1w nw f w F T π∞→=而式(2-38)右边,当∞→1T 时,01→w ,w nw →1,即原来离散频率1nw 趋于连续频率w ,故上式右边亦为w 得连续函数,故得⎰∞∞--=dt e t f w F jwt )()( (2-40)式(2-40)为信号f (t )的傅里叶正变换,它的物理意义是单位频带上的频谱值,即频谱密度,简称为非周期信号频谱。

F (w )一般为复数,故又可写成复指数形式为)()()(w j e w F w F ϕ=式中:)(w F ---------幅度频谱,代表信号中各频率分量的相对大小; )(w ϕ---------相位频谱,代表信号各频率分量之间的相位关系。

2、傅里叶反变换由已知的非周期信号的傅里叶正变换F (w )求原信号f (t )的运算,称为傅里叶反变换。

傅里叶变换简单应用

傅里叶变换简单应用

像傅里叶函数频谱图
8
fftshift %快速傅里叶变换后的图像
平移函数
五·总结
1
对于傅里叶变换,它能够应用到许多的领域,不仅仅是在图像处理方面。
2
通过这次自己动手进行对傅里叶变换应用的动手实验,能够更好地将傅里叶变换应用到实 际生活中,不再是仅仅只会做题。更加的理解了傅里叶变换在实际应用中的作用和用法。
3
傅里叶变换能够更好地运用到实践当中,我们还应该不断的学习,去更加的完善傅里叶变 换在实际中的应用。
20XX
Thanks! 谢谢观看!
单击此处添加正文,文字是您思想的提炼,为了演示发布的良好效果,请言简 意赅地阐述您的观点。
析。
二·步骤流程图
流程图: 对得到的实验结果进行检查,分析。
打开 MATL AB
更改默认路径, 将实验所需文
件放入
编写实验程序, 将程序保存到
默认文件夹
运行程序,检 查错误并纠正, 得到实验结果
三·MATLAB程序源代码: (一)对原图像进行傅里叶
变换
(二)输出彩色图像的傅里叶频谱
(三)对彩色图像进行二维DCT变换
一·用MATLAB实现步骤
1
打开计算机,安装和启动MATL AB程
2
设置默认路径为C盘下的图片文件夹,
序。
将实验所需材料放入该文件夹内。
3
利用MATL AB工具箱中的函数编制
FFT频谱显示的函数。
4
调入、显示获得的图像,图像储存格
式应为“.jpg”。
5
对该程序进行编译,检查错误并纠正。 6
ቤተ መጻሕፍቲ ባይዱ
运行,并显示结果,比较差异进行分
利 用 计 算 机 上 安 装 的 M AT L A B 软 件 , 我 们 可 以 编 写 程 序 代 码 来用傅里叶变换对数字图像进行处理。

傅里叶变换及C语言实现

傅里叶变换及C语言实现

傅里叶变换及C语言实现傅里叶变换(Fourier Transform)是一种将时域信号转换为频域信号的数学工具。

它是由法国数学家傅里叶(Joseph Fourier)在19世纪提出的,被广泛应用于信号处理、图像处理、通信等领域。

F(k)=∫[f(x)e^(-2πikx)]dx其中,F(k)是频域中的复数值表示,k表示频率,f(x)是时域信号。

在计算机中,我们通常使用离散傅里叶变换(Discrete Fourier Transform,简称DFT),用于处理离散的时域信号。

离散傅里叶变换可以表示为:X(k)=∑[x(n)e^(-2πikn/N)]其中,X(k)是频域中的复数值表示,k表示频率,x(n)是时域信号,N表示信号的长度。

C语言是一种广泛应用于嵌入式系统、操作系统、驱动程序等领域的编程语言。

在C语言中,我们可以通过编写代码来实现傅里叶变换。

以下是一个简单的C语言程序,用于实现离散傅里叶变换(DFT):```C#include <stdio.h>#include <math.h>#define N 8 // 信号长度typedef structdouble real;double imag;int k, n;double angle;for(k = 0; k < N; k++)output[k].real = 0;output[k].imag = 0;for(n = 0; n < N; n++)angle = 2 * M_PI * k * n / N;output[k].real += input[n].real * cos(angle) + input[n].imag * sin(angle);output[k].imag += input[n].imag * cos(angle) - input[n].real * sin(angle);}}int main(void)int k;dft(input, output);for(k = 0; k < N; k++)printf("X(%d) = %f + %fi\n", k, output[k].real,output[k].imag);}return 0;```该程序中的信号长度N为8,可以根据实际需求进行修改。

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

1 利用FFT 计算连续时间信号的傅里叶变换设()x t 是连续时间信号,并假设0t <时()0x t =,则其傅里叶变换由下式给出()()i t X x t e dt ωω∞-=⎰令Γ是一个固定的正实数,N 是一个固定的正整数。

当,0,1,2,,1k k N ω=Γ=-时,利用FFT 算法可计算()X ω。

已知一个固定的时间间隔T ,选择T 足够小,使得每一个T 秒的间隔(1)nT t n T ≤<+内,()x t 的变化很小,则式中积分可近似为(1)0()()()n Tiwt nTn X e dt x nT ω∞+-==∑⎰(1)01[]()i t t n Tt nT n e x nT i ωω∞-=+==-=∑ 01()i Ti nTn e ex nT i ωωω-∞-=-=∑ (27)假设N 足够大,对于所有n N ≥的整数,幅值()x nT 很小,则式(27)变为101()()i TN i nTn e X ex nT i ωωωω---=-=∑ (28)当2/k NT ωπ=时,式(28)两边的值为2/2/12/0211()()[]2/2/i k Ni k NN i nk Nn k e e X ex nT X k NT i k NTi k NTππππππ----=--==∑ (29)其中[]X k 代表抽样信号[]()x n x nT =的N 点DFT 。

最后令2/NT πΓ=,则上式变为2/1()[]0,1,2,,12/i k Ne X k X k k N i k NTππ--Γ==- (30) 首先用FFT 算法求出[]X k ,然后可用上式求出0,1,2,,1k N =-时的()X k Γ。

应该强调的是,式(28)只是一个近似表示,计算得到的()X ω只是一个近似值。

通过取更小的抽样间隔T ,或者增加点数N ,可以得到更精确的值。

如果B ω>时,幅度谱()X ω很小,对应于奈奎斯特抽样频率2s B ω=,抽样间隔T 选择/B π比较合适。

如果已知信号只在时间区间10t t ≤≤内存在,可以通过对1nT t >时的抽样信号[]()x n x nT =补零,使N 足够大。

例1 利用FFT 计算傅里叶变换 如图12所示的信号102()0t t x t -≤<⎧=⎨⎩其它其傅里叶变换为:2cos()sin()()2i X e i ωωωωωω--=利用下面的命令,可得到()x t 的近似值和准确值。

图12 连续时间信号x(t)N=input('Input N:'); T=input('Input T:'); %计算X(w)近似值 t=0:T:2;x=[t-1 zeros(1,N-length(t))]; X=fft(x);gamma=2*pi/(N*T); k=0:10/gamma;Xapp=(1-exp(-i*k*gamma*T))/(i*k*gamma)*X; %计算真实值X(w) w=::10;Xact=exp(-i*w)*2*i.*(w.*cos(w)-sin(w))./(w.*w);plot(k*gamma,abs(Xapp(1:length(k))),'o',w,abs(Xact)); legend('近似值','真实值');xlabel('频率(rad/s)');ylabel('|X|')运行程序后输入N=128,T=,此时0.4909Γ=,得到实际的和近似的傅里叶变换的幅度谱如图13所示,此时近似值已经相当准确。

通过增加NT 可以增加更多的细节,减少T 使得到的值更精确。

再次运行程序后输入N=512,T=,此时0.2454Γ=,得到实际的和近似的傅里叶变换的幅度谱如图14所示。

图13 N=128,T=时的幅度谱图14 N=512,T=时的幅度谱2 利用FFT 计算离散信号的线性卷积已知两个离散时间信号[](0,1,2,1)x n n M =-与[](0,1,2,1)y n n N =-,取L =1M N +-,对[]x n 和[]y n 右端补零,使得[]0,1,2,,1x n n M M L ==++-[]0,1,2,,1y n n N N L ==++- (31)利用FFT 算法可以求得[]x n 和[]y n 的L 点DFT ,分别是[]X k 和[]Y k ,利用DTFT 卷积性质,卷积[]*[]x n y n 等于乘积[][]X k Y k 的L 点DFT 反变换,这也可以通过FFT?算法得到。

例2 利用FFT 计算线性卷积已知[]0.8[]nx n u n =,其中[]u n 为单位阶跃序列,信号[]y n 如图15所示。

由于当16n >时,[]x n 很小,故M 可以取为17;N 取10,126L M N =+-=。

利用下面的Matlab 命令,可得到[]x n 、[]y n 的卷积图形如图15所示。

subplot(3,1,1);n=0:16; x=.^n; stem(n,x);xlabel('n');ylabel('x[n]'); subplot(3,1,2); n=0:15;y=[ones(1,10) zeros(1,6)];stem(n,y);xlabel('n');ylabel('y[n]') subplot(3,1,3); L=26;n=0:L-1;X=fft(x,L);Y=fft(y,L); Z=X.*Y;z=ifft(Z,L); stem(n,z);xlabel('n');ylabel('z[n]')图15 信号x[n]、y[n]及其卷积z[n]=x[n]*y[n]利用下面的Matlab命令,可得到信号x[n]、y[n]的幅度谱与相位谱如图16所示。

subplot(2,2,1);L=26;k=0:L-1;n=0:16;x=.^n;X=fft(x,L);stem(k,abs(X));axis([0 25 0 5]);xlabel('k');ylabel('|X[k]|')subplot(2,2,2);stem(k,angle(X));axis([0 25 -1 1]);xlabel('k');ylabel('Angle(X[k])(弧度)')subplot(2,2,3);y=ones(1,10);Y=fft(y,L);stem(k,abs(Y));axis([0 25 0 10]);xlabel('k');ylabel('|Y[k]|')subplot(2,2,4);stem(k,angle(Y));axis([0 25 -3 3]);xlabel('k');ylabel('Angle(Y[k])(弧度)')图16 信号x[n]、y[n]的幅度谱与相位谱3 利用FFT 进行离散信号压缩利用FFT 算法对离散信号进行压缩的步骤如下:1)通过采样将信号离散化;2)对离散化信号进行傅里叶变换;3)对变换后的系数进行处理,将绝对值小于某一阈值的系数置为0,保留剩余的系数;4)利用IFFT 算法对处理后的信号进行逆傅里叶变换。

例3 对单位区间上的下列连续信号1()cos(4)sin(8)2f t t t t ππ=++以256s f Hz =采样频率进行采样,将其离散化为82个采样值[]()|()(/256),t nT f n f t f nT f n ====0,1,2,,255n =用FFT 分解信号,对信号进行小波压缩,然后重构信号。

令绝对值最小的80%系数为0,得到重构信号图形如图17 a)所示,均方差为,相对误差为;令绝对值最小的90%系数为0,得到重构信号图形如图17 b)所示,均方差为,相对误差为。

a) 绝对值最小的80%系数为0的重构信号(FFT) b) 绝对值最小的90%系数为0的重构信号(FFT)图17 用FFT压缩后的重构信号相关Matlab程序如下function wc=compress(w,r)%压缩函数%输入信号数据w,压缩率r%输出压缩后的信号数据if(r<0)|(r>1)error('r 应该介于0和1之间!');end;N=length(w);Nr=floor(N*r);ww=sort(abs(w));tol=abs(ww(Nr+1));wc=(abs(w)>=tol).*w;function [unbiased_variance,error]=fftcomp(t,y,r)%利用FFT做离散信号压缩%输入时间t,原信号y,以及压缩率r%输出原信号和压缩后重构信号的图像,以及重构均方差和相对l^2误差if(r<0)|(r>1)error('r 应该介于0和1之间!');end;fy=fft(y);fyc=compress(fy,r); %调用压缩函数yc=ifft(fyc);plot(t,y,'r',t,yc,'b');legend('原信号','重构信号');unbiased_variance=norm(y-yc)/sqrt(length(t));error=norm(y-yc)/norm(y);输入以下Matlab命令:t=(0:255)/256;f=t+cos(4*pi*t)+1/2*sin(8*pi*t);[unbiased_variance,error]=fftcomp(t,f,unbiased_variance =error =如果用Harr尺度函数和Harr小波分解信号,对信号进行小波压缩,然后重构信号。

令绝对值最小的80%系数为0,得到重构信号图形如图18 a)所示,均方差为,相对误差为;令绝对值最小的90%系数为0,得到重构信号图形如图18 b)所示,均方差为,相对误差为。

a) 绝对值最小的80%系数为0的重构信号(Harr) b) 绝对值最小的90%系数为0的重构信号(Harr)图18 用Harr小波压缩后的重构信号相关Matlab程序如下function [unbiased_variance,error]=daubcomp(t,y,n,r)%利用Daubechies系列小波做离散信号压缩%输入时间t,原信号y,分解层数n,以及压缩率r%输出原信号和压缩后重构信号的图像,以及重构均方差和相对l^2误差if(r<0)|(r>1)error('r应该介于0和1之间!');end;[c,l]=wavedec(y,n,'db1');cc=compress(c,r); %调用压缩函数yc=waverec(cc,l,'db1');plot(t,y,'r',t,yc,'b');legend('原信号','重构信号');unbiased_variance=norm(y-yc)/sqrt(length(t));error=norm(y-yc)/norm(y);输入以下Matlab 命令: t=(0:255)/256;f=t+cos(4*pi*t)+1/2*sin(8*pi*t);[unbiased_variance,error]=daubcomp(t,f,8,unbiased_variance =error =结论:在信号没有突变、快变化或者大致上具有周期性的信号,用FFT 可以处理得很好(甚至比小波还要好)。

相关文档
最新文档