精华内容
下载资源
问答
  • 傅里叶逆变换

    千次阅读 2019-08-01 08:11:47

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 傅里叶逆变换C程序

    2018-04-25 14:27:51
    傅里叶逆变换c语言程序,已测试可用,滤波变换,频域处理后做波形还原,均可用,需要编写自己 的傅里叶逆变换类的也可以参考使用
  • 然后求出复波的傅里叶变换并求。在我希望看到原始波形的结果,因为应该没有数据丢失,但是我收到了一个非常不同的波形。在代码:import numpy as npimport matplotlib.pyplot as pltimport random#G...

    问题

    我试图从一组从音频文件中获取的数据中删除一个频率。在

    为了简化我的问题,我创建了下面的代码,它创建了一组wave并将它们合并到一个复杂的wave中。然后求出复波的傅里叶变换并求逆。在

    我希望看到原始波形的结果,因为应该没有数据丢失,但是我收到了一个非常不同的波形。在

    代码:import numpy as np

    import matplotlib.pyplot as plt

    import random

    #Get plots

    fig, c1 = plt.subplots()

    c2 = c1.twinx()

    fs = 100 # sample rate

    f_list = [5,10,15,20,100] # the frequency of the signal

    x = np.arange(fs) # the points on the x axis for plotting

    # compute the value (amplitude) of the sin wave for each sample

    wave = []

    for f in f_list:

    wave.append(list(np.sin(2*np.pi*f * (x/fs))))

    #Adds the sine waves together into a single complex wave

    wave4 = []

    for i in range(len(wave[0])):

    data = 0

    for ii in range(len(wave)):

    data += wave[ii][i]

    wave4.append(data)

    #Get frequencies from complex wave

    fft = np.fft.rfft(wave4)

    fft = np.abs(fft)

    #Note: Here I will add some code to remove specific frequencies

    #Get complex wave from frequencies

    waveV2 = np.fft.irfft(fft)

    #Plot the complex waves, should be the same

    c1.plot(wave4, color="orange")

    c1.plot(waveV2)

    plt.show()

    结果:(橙色为产生波,蓝色为原始波)

    预期结果:

    蓝色和橙色线条(原始和新创建的波浪)的值应该完全相同

    展开全文
  • 本资源配合傅里叶逆变换的演示过程,原文章在地质:https://blog.csdn.net/yx171532/article/details/112787337
  • 短时傅里叶逆变换

    2017-10-22 16:30:24
    用MATLAB实现的短时傅里叶逆变换,可以直接用来处理数据。
  • 傅里叶变换和傅里叶逆变换的C++代码,亲测,有详细的解释。 有问题可以留言。
  • C++离散傅里叶逆变换 一、序言: 该教程承接上文的离散傅里叶变换,用于进行离散傅里叶逆变换。 二、设计目标 对复数数组进行离散傅里叶逆变换,并生成可供使用的图像类。 三、详细步骤 输入:经傅里叶...

    C++离散傅里叶逆变换

    一、序言:

    该教程承接上文的离散傅里叶变换,用于进行离散傅里叶逆变换。

     

    二、设计目标

    对复数数组进行离散傅里叶逆变换,并生成可供使用的图像类。

     

    三、详细步骤

    输入:经傅里叶变换后产生的复数数组

    输出:MyImage图像

    定义:

    static MyImage* Idft2(ComplexNumber *Scr,int const width,int const height);

     

    实现:MyImage* MyCV::Idft2(ComplexNumber *Scr, int width, int height)

    {
    
        int bytesPerLine = (width*8+31)/32*4;
    
     
    
        double* double_data = new double[width*height];
    
        memset(double_data,0,sizeof(double_data)*sizeof(double)); //全部赋值为0
    
     
    
        double fixed_factor_for_axisX = (2 * PI) / height;                  // evaluate i2π/N of i2πux/N, and store the value for computing efficiency
    
        double fixed_factor_for_axisY = (2 * PI) / width;                   // evaluate i2π/N of i2πux/N, and store the value for computing efficiency
    
        for (int x = 0; x<height; x++) {
    
            for (int y = 0; y<width; y++) {
    
                for (int u = 0; u<height; u++) {
    
                    for (int v = 0; v<width; v++) {
    
                        double powerU = u * x * fixed_factor_for_axisX;         // evaluate i2πux/N
    
                        double powerV = v * y * fixed_factor_for_axisY;         // evaluate i2πux/N
    
                        ComplexNumber cplTemp;
    
                        cplTemp.SetValue(cos(powerU + powerV), sin(powerU + powerV));
    
                        double_data[y + x*width] = double_data[y + x*width] +
    
                                ((Scr[v + u*width] * cplTemp).m_rl
    
                                /(height*width));
    
                    }
    
                }
    
            }
    
        }
    
     
    
        unsigned char *idft2_data = new unsigned char[bytesPerLine*height];//存储处理后的数据
    
     
    
        for(int i=0;i<height;i++)
    
            for(int j=0;j<width;j++)
    
            {
    
                idft2_data[i*bytesPerLine+j] = (unsigned char)double_data[i*width+j];
    
            }
    
     
    
        return new MyImage(idft2_data,width,height,MyImage::format::GRAY8);
    
    }

     

    至此,离散傅里叶逆变换的方法实现完成,效果图如下:

     

     

    如果上述教程或代码中有任何错误,欢迎批评和指证。

     

    转载于:https://www.cnblogs.com/akakakkk/p/8595156.html

    展开全文
  • matlab中如何对一组复数频域信号进行快速傅里叶逆变换为何需要对复数频域信号进行快速傅里叶逆变换快速傅里叶变换(fft)后的数据格式快速傅里叶逆变换至原信号时域波型第一步第二步第三步 为何需要对复数频域信号...

    为何需要对复数频域信号进行快速傅里叶逆变换

    目前查到很多资料对快速傅里叶变换讲解非常清楚,包括其原理以及变换后的具体处理均有很多介绍,可参见以下链接:

    但是对如何处理一组频域信号转换成原始信号的傅里叶逆变换很少介绍,并且直接对一组频域信号进行快速傅里叶逆变换(ifft)是还原不到原始时域状态的,经过一番研究后,在此进行相应的整理,以便日后进行使用。

    快速傅里叶变换(fft)后的数据格式

    matlab中一个信号经过快速傅里叶变换后,得到的数据与原始数据的采样个数是一致的,但是这里面有一半的数据是重复的,举例:
    采样N=256个数据,采样频率是Fs=256,信号为

    S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)
    

    对其进行快速傅里叶变换
    代码如下

    clear;
    Fs=256;
    T=1/Fs;
    N=256;
    t=(0:N-1)*T;
    S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180);
    Y=fft(S);
    

    Y即为快速傅里叶变换后的数据,这组数据的格式如下:

    1. 每个数据的实部为an,虚部位bn,在matlab中看到的形式是an+bni,sqrt(an2+bn2)为其模,arctan(b/a)为其相位角。
    2. Y(1)为直流分量的N倍,即0Hz时的值再乘以N,此例中Y(1)为512(即2*256);
    3. Y(2:N/2+1)为N/2倍的信号值,对应频率从Fs/N ~ Fs/2;
    4. Y(N/2+1:end)对应频率从-Fs/2 ~ -Fs/N,可以发现Y(N/2+1)点被共用,两值是相加,所以该点比较特殊。这部分的值和Y(2:N/2+1)的值是共轭的,即实部相同虚部相反,这也是为什么说快速傅里叶变换出来的值有一半是重复的原因。
      此部分可参考链接: 关于实信号的双边谱和单边谱.
      对Y直接求模
      上图为对Y直接求模后的图形,横坐标为其对应的频率,可看到数据关于第N/2+1点(即第127点)对称,Y(1)点对应的频率为0Hz,值为2x256=512。
      代码复现上图如下:
    clear;
    Fs=256;
    T=1/Fs;
    N=256;
    Fn=zeros(N,1);
    t=(0:N-1)*T;
    S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180);
    for n=1:N
        Fn(n)=(n-1)*Fs/N;
    end
    Y=fft(S);
    plot(Fn,abs(Y));
    

    从以上数据结构中就不难发现,如果你直接对一个信号进行逆向变换时,它并不满足上面的这种格式,所以变化出来的值必定不是原信号的模样。所以为了能够复现出原来的信号,必须对现有信号按照以上格式进行修改才行。

    快速傅里叶逆变换至原信号时域波型

    聪明的你看到这应该知道怎么去做了,以下仅是举例说明。

    假设这时你有一个频率信号D(x),x为频率,它的频谱范围为0-128Hz,以1Hz为频率间隔,总共129个数据点,并且每个点的数据为an+bni的形式存在。

    第一步

    保留直流分量到数据首部,即Y(1)=D(0)x128x2。

    第二步

    Y(2:128)=D(1:127)x128
    Y(256:130)=D(1:127)x128
    Y(129)=Real(D(128)x256)

    第三步

    对Y进行快速逆变换就可以得到原始的数据图形
    细心的你会发现Y(128)中只取了实部进行计算,这是因为此点为正频与负频共用点,两个值是共轭的,所以他们相加后得到的值仅有实值,虚值部分抵消了。

    验证

    现有一组数据点击此处下载数据,如下图所示
    data数据图
    该数据为[100,5]的参数,第一列为频率,第二列为幅值,第三列为相位角(角度单位),第四列为实值,第五列为虚值。
    采用上文中的步骤对数据进行处理,代码如下:

    clear;
    data=load('test.txt');
    [m,n]=size(data);
    N=m*2;
    predata=zeros(2*m,1);
    predata(1)=0;    %由于本数据未给出直流分量,所以默认为0
    for i=2:N/2
        predata(i)=(data(i-1,4)+data(i-1,5)*sqrt(-1))*(N/2);%对2~N/2的数据进行赋值
    end
    predata(N/2+1)=data(N/2,4)*N;%对第N/2+1位置进行赋值
    for i=2:N/2
        predata(N-i+2)=(data(i-1,4)-data(i-1,5)*sqrt(-1))*(N/2);%对N/2+2~END的数据进行赋值
    end
    %此时predata的数据已处理完成,直接做逆变换即可
    y=real(ifft(predata));
    %接下来需要对时间参量进行确定
    %数据的采集点总数N已知,需要确认采样频率Fs,可求出采样周期T
    Fn=data(2,1)-data(1,1);
    Fs=Fn*N;
    T=1/Fs;
    for i=1:N
       t(i)=(i-1)*T; 
    end
    figure(1);
    plot(t,y(:,1));
    %{
    根据傅里叶逆变换的定义,可以知道时域信号是由各种频域信号叠加而成,
    那么我们根据这个特性直接将频域信号进行叠加来验证逆变换的正确性
    %}
    C(:)=data(:,2);    %幅值
      %相位角
    phi=zeros(m);
    nw=zeros(m);
    for i=1:m
        phi(i)=data(i,3)*pi/180;
        nw(i)=data(i,1)*pi*2;
    end
    fz=zeros(m,N);
    z=zeros(N,1);
    for i=1:m    
        for j=1:N
            fz(i,j)=C(i)*cos(nw(i)*t(j)+phi(i));
        end
    end
    for i=1:N
       z(i,1)=sum(fz(:,i)); 
    end
    figure(2);
    plot(t,z);
    

    figure1
    figure(1) 经处理后的快速傅里叶逆变换图形
    figure2
    figure(2)利用傅里叶变换的数学意义进行变换后的图形
    上两张图进行对比发现,波形和相位以及幅值基本一致(仅在负极大值处有偏差),说明数据经傅里叶还原后与原数据图像基本相同,还原成功!

    展开全文
  • 【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)一、二维FFTFFTFFT快速傅里叶变换 公式推导二、二维FFTFFTFFT 及 IFFTIFFTIFFT代码实现(迭代法) 前面我们实现了一维...
  • 快速傅里叶逆变换IFFT算法的C++实现

    热门讨论 2009-11-14 14:54:57
    快速傅里叶逆变换 IFFT算法 C++实现 包括TFFT,整序
  • 文章目录1. 定义2. 变换和处理3. 函数4. 实例演示例1:单频正弦信号(整数周期采样)例2:含有...这一篇来研究如何进行利用离散傅里叶逆变换(iDFT)从频谱中恢复时域信号。 离散傅里叶逆变换 (iDFT)的定义为: x(n)=i
  • 傅里叶变换我们生活在时间的世界中,早上7:00起来吃早饭,8:00去挤地铁,9:00开始上班。。。以时间为参照就是时域分析。但是在频域中一切都是静止的!可能有些人无法理解,我建议大家看看这个文章,写的真是相当好,...
  • I am trying to implement in python some functions that transform images to their fourier domain and vice-versa for image processing tasks.I implemented the 2D-DFT using repeated 1D-DFT, and it worked ...
  • 以下是逆变换的代码。 1 iFFTAnalysis2(refcomplexData);2 3 areaFFT.AxisX.Maximum = 0.2;4 areaFFT.AxisX.Minimum = 0;5 areaFFT.AxisX.MajorTickMark.Interval = 1;6 7 8 areaFFT.AxisY.Maximum = 2;9 areaFFT....
  • 傅立叶变换性质的matlab实现 一 傅立叶变换的时移性质 若则 结论: 延时或超前后其对应的幅度谱保持不变但相位谱中一切频率分量的相位均滞后或超前 例1 1用matlab画及频谱幅度谱及相位谱 2用matlab画及频谱幅度谱及...
  • 原理短时傅里叶变换(Short Time Fourier Transform, STFT) 是一个用于语音信号处理的通用工具.它定义了一个非常有用的时间和频率分布类, 其指定了任意信号随时间和频率变化的复数幅度. 实际上,计算短时傅里叶变换的...
  • 因此, Graph上的傅里叶变换可以表示为: 逆变换为: 四、传统傅里叶卷积与图卷积 传统傅里叶卷积: 卷积定理:函数卷积的傅里叶变换是函数傅立叶变换的乘积,即对于函数 与 两者的卷积是其函数傅立叶变换乘积的...
  • 离散非周期信号的傅里叶变换 设 为离散非周期信号,其基信号为 ,则Fourier变换为 ,因 , 的傅里叶逆变换为 。 7. 小结 7.1 连续信号 周期信号,基信号 ;非周期信号,基信号 。 7.2 离散信号 周期信号,基信号 ;...
  • 接下来我们验证一下离散傅里叶逆变换的正确性 F − 1 F f ‾ [ n ] = 1 N ∑ m = 0 N − 1 F f ‾ [ m ] e 2 π i m n N = 1 N ∑ m = 0 N − 1 ∑ k = 0 N − 1 f ‾ [ k ] e − 2 π i m k N e 2 π i m n N = 1...
  • ifft 快速傅里叶逆变换(Matlab)

    千次阅读 2020-04-22 21:49:34
    X = ifft(Y,n) 通过用尾随零填充 Y 以达到长度 n,返回 Y 的 n 点傅里叶逆变换。 X = ifft(Y,n,dim) 返回沿维度 dim 的傅里叶逆变换。例如,如果 Y 是矩阵,则 ifft(Y,n,2) 返回每一行的 n 点逆变换。 X = ifft(___...
  • [Python图像处理六] :Opencv图像傅里叶变换和傅里叶逆变换原理及实现 一、傅里叶变换 1、傅里叶变换原理 2、自定义傅里叶变换功能函数 3、OpenCV库函数实现傅里叶变换 二、傅里叶逆变换 1、傅里叶逆变换原理 2、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 704
精华内容 281
关键字:

傅里叶逆变换