精华内容
下载资源
问答
  • 离散傅里叶变换DFT)的矩阵形式

    千次阅读 2019-12-16 15:48:31
    废话不多说了,先看一下离散傅里叶变换的公式: 公式1 看着如此简单的公式,其实暗藏玄机,往往我们忽略的都是最重要的细节。第一,这个公式针对的是离散周期信号,得到的频域也是离散周期频信号。这也是最普遍...

    废话不多说了,先看一下离散傅里叶变换的公式:

    公式1

    看着如此简单的公式,其实暗藏玄机,往往我们忽略的都是最重要的细节。第一,这个公式针对的是离散周期信号,得到的频域也是离散周期频信号。这也是最普遍使用的公式,方便在计算机上计算。即使信号不是周期信号,在计算机上计算的时候,由于序列长度有限,我们就可以认为这只是信号的一个周期内容。同样,我们输入到计算机中的序列一定是经过采样定理采样后的信号,因此任意一个信号在计算机上做傅里叶变换的时候,都是离散周期信号!!第二,如果信号x(n)是周期函数,那么信号应该限制在一个周期T1之内。第三,变换前后的序列长度是一样的都为[0,N-1]。第四,信号长度N与采样频率f是不一样的,他们的关系是:N=f*T1,其中T1为信号总时间。第五,变换后的横坐标轴不是1,2,3……,而应该是f1,2*f1,3*f1……,因为非简化的离散傅里叶变换公式应该是:

    公式2-1 
    公式2-2

    ​其中,T1为信号时间,N为信号采样数,Ts为信号采样间隔时间,f1为频率间隔。这样就能很清晰的看到,变换后的坐标轴都是f1的整数倍。​由时域采样间隔Ts,确定频域重复周期fs,而df→f1=fs/N,即确定了频域的横轴坐标。要想详细了解可以看郑君里的《信号与系统》下册,第九章内容。

    好像跑题了,不过离散跟连续真的是有很大的区别,需要特别关注。继续说如何得到离散傅里叶的矩阵形式,我们将上式展开写成如下形式:

    公式3

    ​显而易见,上式中的W各次幂组成的矩阵就是我们要找的离散傅里叶变换矩阵。是不是很简单呢?同理,我们可以得到IDFT的变换矩阵如下:

    公式4  

    可以从上面看出,两个变换矩阵都是方阵,而且都是对称矩阵。​

    对于DFT的正变换在matlab中,已经有写好的程序为dftmtx(n)。而逆变换的矩阵可以通过求dftmtx(n)矩阵的逆,当然也可以自己写(突然发现自己好蠢,为毛要自己写)。matlab程序如下:

    N=width;

    x=(0:N-1)'*(0:N-1);

    W=exp(2*pi*1i*x/N)/N;

    ​总结一下,其实大部分变换都存在变换矩阵,就是将变换从公式形式向量化,写为矩阵形式即可。其次,因为我们往往会在计算机上使用,也就意味着我们用到的都是离散变换,而离散域跟连续域的不同是我们要特别注意的,我也已经在文中写了几条,也希望各为大神给予指点。

    展开全文
  • DFT的matlab源代码傅里叶 傅立叶实现用于执行离散傅立叶变换DFT)的功能。 有关更多信息,请参阅文档。
  • 傅里叶变换矩阵

    千次阅读 2020-10-10 16:31:08
    matlab 得到归一化DFT矩阵 function F=DFT(N) %xn为序列 n = [0:N-1]; %n的行向量,为1*N矩阵 k = [0:N-1]; %k的行向量,为1*N矩阵 Wn = exp(-j*2*pi/N); %常数 nk = n'*k; %将n倒置之后与矩阵k进行矩阵的代数运算...

    1. matlab 的fft()函数是没有归一化的DFT

    matlab 得到归一化DFT矩阵

    function F=DFT(N) %xn为序列
    n = [0:N-1]; %n的行向量,为1*N矩阵
    k = [0:N-1]; %k的行向量,为1*N矩阵
    Wn = exp(-j*2*pi/N); %常数
    nk = n'*k; %将n倒置之后与矩阵k进行矩阵的代数运算,为N*N矩阵,此处发生了N*N次乘法运算
    Wnnk = Wn.^nk; %将常数Wn与nk进行点幂运算,为N*N矩阵,此处发生了N*N次点幂运算
    F = Wnnk / sqrt(N);
    K =  64;
    F=DFT(K);
    h_K = randn(K, 1);
    H_F = F*h_K;
    H_fft = fft(h_K) ./ sqrt(K);%fft做傅里叶变换是非归一化的

    得到的值有轻微差别,但看起来是一样的 

    2.DFT矩阵F是对称的,即F = F的转置

    3.矩阵A左乘DFT矩阵是对矩阵A的每一列做傅里叶变换,矩阵A右乘DFT矩阵是对矩阵A的每一行做傅里叶变换,如果A是对角阵,那么左乘跟右乘是一样的。

    展开全文
  • 压缩感知中DCT变换矩阵的构造

    千次阅读 2016-04-07 20:34:02
    信号的稀疏表示始终都是一个很核心的问题,在OMP算法和BCS-SPL算法等算法中,都会涉及到DCT变换矩阵的构造,但是其往往和我们所了解的DCT变换的定义(DCT变换的定义可以参考之前的博文离散傅立叶变换DFT和离散余弦...

    在视频压缩感知领域,信号的稀疏表示始终都是一个很核心的问题,在OMP算法和BCS-SPL算法等算法中,都会涉及到DCT变换矩阵的构造,但是其往往和我们所了解的DCT变换的定义(DCT变换的定义可以参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT)有所不同。

    考虑到这些算法代码中DCT矩阵的构造都显得晦涩难懂而且基于定义构造的DCT变换矩阵和它们的功能又完全一样(且更容易理解),因此我们从DCT的定义出发给出DCT变换矩阵的构造代码。

    一维DCT变换矩阵

    参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT中一维DCT的定义可以得到如下实现代码(直接拷贝保存为.m文件即可在MATLAB环境中使用):

    function [Phi] = DCT_1D_Matrix(m)
    
    %
    %
    % 该函数产生1维DCT-II变换矩阵,左乘对信号进行DCT-II变换,转置后左乘对信号进行IDCT-II逆变换
    % 输入参数:
    %           m:信号的长度
    % this function return 2D DCT-II transform matrix,
    %       
    %       left multiply: transform the signal into dct domain
    %
    %       transpose and left multiply: transform the coefficient into
    %       pixel domian
    %
    % Input parameters:
    %           m: the number of signal
    % 
    % Programmer: Li Wenhao
    % School: Electronic and information school
    % University: South China University of Technology
    % Date: 4/7/2016
    %
    
    Phi = zeros(m,m);
    
     for k = 1:m
         for n = 1:m
             Phi(k,n) = cos((2*n-1)*(k-1)*pi/(2*m));
         end
         if k==1
             Phi(k,:) = sqrt(1/m).*Phi(k,:);
         else
            Phi(k,:) = sqrt(2./m).*Phi(k,:);
         end
     end

    注意:该矩阵左乘信号进行DCT变换,转置后左乘进行反变换!

    说明:输入处理向量的长度即可得到一维DCT变换矩阵。

    二维DCT变换矩阵

    参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT中二维DCT的定义可以得到如下实现代码(直接拷贝保存为.m文件即可在MATLAB环境中使用):

    function [Phi] = DCT_2D_Matrix(m,n)
    
    %
    %
    % 该函数产生2维DCT-II变换矩阵,左乘对信号进行DCT-II变换,转置后左乘对信号进行IDCT-II逆变换
    % 输入参数:
    %           m:信号的行数
    %           n:信号的列数
    % this function return 2D DCT-II transform matrix,
    %       
    %       left multiply: transform the signal into dct domain
    %
    %       transpose and left multiply: transform the coefficient into
    %       pixel domian
    % 
    % Input parameters:
    %           m: the number of row
    %           n: the number of col
    %
    % Programmer: Li Wenhao
    % School: Electronic and information school
    % University: South China University of Technology
    % Date: 4/7/2016
    %
    
    
    Phi = zeros(m*n,m*n);
    
    temp = zeros(m,n);
    
    for i = 1:m
        for j = 1:n
    
            for p = 1:m
                for q = 1:n
                    temp(p,q) = cos((2*p-1)*(i-1)*pi/(2*m))*cos((2*q-1)*(j-1)*pi/(2*n));
                end
            end
    
            if i==1
                temp = sqrt(1/m).*temp;
            else
                temp = sqrt(2/m).*temp;
            end
            if j==1
                temp = sqrt(1/n).*temp;
            else
                temp = sqrt(2/n).*temp;
            end
            Phi((j-1)*m+i,:) = temp(:)';
        end
    end
    

    注意:该矩阵左乘信号进行DCT变换,转置后左乘进行反变换!

    说明:一般我们输入二维信号的长和宽,然后通过上述代码得到其二维DCT变换矩阵,然后通过该矩阵对信号的列化向量进行正反变换处理,二维变换系数矩阵可以通过reshape对一维的列化的系数进行处理得到。

    为什么反变换是其转置

    基于公式的理论分析

    参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT中一维和二维DCT的定义可以知道:

    1. 在一维DCT正变换中,我们构造的矩阵的每一行的u都是一个定值,但是在反变换中,对参数u进行累加因此是个变量,所以将其转置即是其反变换;

    2. 在二维 DCT正变换中,我们构造的矩阵的每Nv都是一个定值,然而C(u,v)列化之后每N个元素的v都是一个定值,因此根据矩阵相乘的关系可以知道其转置即是其反变换;

    基于代码的验证

    通过上述代码分别产生一维的矩阵P和二维的矩阵Q,然后在MATLAB中分别计算P'*PQ'*Q然后观察其结果是否为单位矩阵。为单位矩阵则说明反变换是其转置。

    总结

    OMP算法和BCS-SPL算法中分别使用了一维和二维的DCT变换矩阵,通过使用我们的矩阵进行替换然后仿真,其结果完全一致,这正好说明不同的DCT变换矩阵的功能是完全一样的,所以以后就可以使用我们自己构造的DCT变换矩阵。

    展开全文
  • 文章目录傅里叶级数与傅里叶变换离散傅里叶变换 傅里叶级数与傅里叶变换 这个学过信号与系统应该都挺了解的 傅里叶级数 傅里叶变换 离散傅里叶变换 DFT将一个采样函数从一个域转换到频域。 离散信号和周期信号最重要...

    傅里叶级数与傅里叶变换

    这个学过信号与系统应该都挺了解的
    傅里叶级数

    傅里叶变换

    离散傅里叶变换

    DFT将一个采样函数从一个域转换到频域。
    离散信号和周期信号最重要的关联在于它可以用一组有限的数字表示。因此,可以使用数字系统来实现DFT。

    X(k)=n=0N1x(n)ej2πkn/NX(k) = \sum\limits_{n=0}^{N-1}x(n)e^{-j2\pi kn/N}

    复正弦求和
    这个求和的结果恰好落在实值轴上或虚轴上。

    离散信号

    如果有一个N点的时域信号
    在这里插入图片描述
    在使用DFT进行分析的时候,会得出各个品类的正弦及余弦幅度,其中余弦幅度可以看作是复数的实数部分,而正弦幅度可以看作是复数的虚数部分。
    在复频域中,有N/2+1个正弦和N/2+1个余弦。

    (频域样本数量为N/2+1是因为时域信号是纯实数的,复数时域信号经过DFT后有N个样本的频域信号)

    具有N点的DFT可以通过NxN矩阵成一个大小为N的矢量来缺点

    S=[111...11ss2...sN11s2s4...s2(N1)1s3s6...s3(N1)...............1sN1s2(N1)...s(N1)(N1)]S =\begin{bmatrix} 1&1&1&...&1\\ 1&s&s^2&...&s^{N-1}\\ 1&s^2&s^4&...&s^{2(N-1)}\\ 1&s^3&s^6&...&s^{3(N-1)}\\ ...&...&...&...&...\\ 1&s^{N-1}&s^{2(N-1)}&...&s^{(N-1)(N-1)}\\ \end{bmatrix}

    G=Sg,s=ei2πNG = S\cdot g,s = e^{\frac{-i2\pi}{N}}

    则有频域样本

    G(t)=n=0N1g(n)sknfor    k=0,...,N1G(t) = \sum_{n=0}^{N-1}g(n)s^{kn} for \ \ \ \ k = 0,...,N-1

    S是对角对称矩阵,且第k行和第N-k行共轭(从第0行开始数),因此N个采样点的实值输入信号仅具有N/2+1个余弦和正弦,盛于的N/2频域值提供了冗余信息。

    矩阵向量乘法

    示例代码

    #define SIZE 8
    typedef int BaseType;
    void matrix_vector(BaseType M[SIZE][SIZE], BaseType V_In[SIZE], BaseType V_Out[SIZE]) {
    	BaseType i, j;
    data_loop:
    	for (i = 0; i < SIZE; i++) {
    		BaseType sum = 0;
    	dot_product_loop:
    		for (j = 0; j < SIZE; j++) {
    			sum += V_In[j] * M[i][j];
    			}
    		V_Out[i] = sum;
    	}
    }
    

    matrix_vector 功能共有三个参数,我们对前两个参数进行乘法计算,输入矩阵和向量分别是BaseType M[SIZE][SIZE] 和 BaseType V In[SIZE]。第三个参数 BaseType V_Out[SIZE] 是合成向量。

    pipeline和并行运行

    这个基本算法就是循环嵌套,但是可以考虑能不能用并行思想来加速。

    比如先考虑优化sum的累加

    #define SIZE 8
    typedef int BaseType;
    void matrix_vector(BaseType M[SIZE][SIZE], BaseType V_In[SIZE], BaseType V_Out[SIZE]) {
    	BaseType i, j;
    data_loop:
    for (i = 0; i < SIZE; i++) {
    	BaseType sum = 0;
    	V_Out[i] = V_In[0] * M[i][0] + V_In[1] * M[i][1] + V_In[2] * M[i][2] +
    				V_In[3] * M[i][3] + V_In[4] * M[i][4] + V_In[5] * M[i][5] +
    				V_In[6] * M[i][6] + V_In[7] * M[i][7];
    	}
    }
    

    如果每个乘法同时执行,可以用加法器树求和就很好了。

    在这里插入图片描述

    在FPGA上加法器无法共享,因为加法器和多路复用器需要相同数量的资源

    使用更少的乘法器将需要更多的时间周期。
    在这里插入图片描述
    在此基础上还可以进一步优化

    在这里插入图片描述

    还有更牛逼的优化

    在这里插入图片描述

    通过添加几个指令就能实现高度并行

    #define SIZE 8
    typedef int BaseType;
    
    void matrix_vector(BaseType M[SIZE][SIZE], BaseType V_In[SIZE], BaseType V_Out[SIZE]) {
    #pragma HLS array_partition variable=M dim=2 complete
    #pragma HLS array_partition variable=V_In complete
    	BaseType i, j;
    data_loop:
    	for (i = 0; i < SIZE; i++) {
    #pragma HLS pipeline II=1
    		BaseType sum = 0;
    	dot_product_loop:
    		for (j = 0; j < SIZE; j++) {
    			sum += V_In[j] * M[i][j];
    		}
    		V_Out[i] = sum;
    	}
    }
    

    内部j循环由Vivado HLS 自动展开,因此j在每次使用的时候都被替换为常量。

    展开全文
  • V^H是DFT矩阵的厄米(hermitian),并且input s def graph_freq_spectrum(freq_spectrum) :用于绘制频谱图的功能。 使用plotly Python库实现 idft.py def idft(freq_spectrum) :将频谱转换为时域正弦波的函数。 ...
  • 这种 DFT变换的向量矩阵表示中是直观的,并且在内存和时间之间的交易中是有效的(避免正弦、余弦计算循环)。 规范化也很简单。
  • 离散傅里叶变换DFT)1. 标准正交基向量空间(或)的标准正交基满足以下两个条件:我们可以得到一个的标准正交基矩阵:再把每一个标准正交基对应的系数写成一个列向量:则信号的标准正交基表示:那么(这里,是指的...
  • 进行离散傅立叶变换主要用到dft()函数即 dft(InputArray,OutputArray,flags=0,nonzeroRows=0); 其中InputArray为输入矩阵,可以为实数或者虚数。 OutputArray为输出矩阵。 flags为标志符,默认为0代表傅立叶变换,...
  • 图像处理 二维离散傅里叶变换DFT matlab代码图像处理领域离散傅里叶变换的作用二维离散傅里叶变换二维离散傅里叶变换公式将二维的离散傅里叶变换进行转化将系数转化为矩阵形式注意,从矩阵的乘积i形式可以看出,原来...
  • 上一篇博文提到了离散傅里叶变换,地址如下:http://blog.sina.com.cn/s/blog_7445c2940102wcdj.html其实,离散余弦变换(DCT)就是离散傅里叶变换(DFT)的一部分,那么既然已经有了DFT,为什么还需要DCT呢?...
  • 本文主要总结了离散傅里叶变换DFT)的定义、矩阵算法、性质,阐述了频域取样点数的限制,推导了内插公式,解释了用 DFT 对连续时间信号逼近的问题。在性质方面,介绍了 DFT 的线性性质、如何用正变换计算逆变换、...
  • DFT的matlab源代码沃尔什-哈达玛变换 使用Hadamard变换压缩图像 描述 摘自Wikipedia: Hadamard变换(也称为Walsh-Hadamard变换, Hadamard-Rademacher-Walsh变换, Walsh变换或Walsh-Fourier变换)是广义Fourier...
  • 计算以下图像的离散傅里叶变换 f=[1441244224421441] f=\begin{bmatrix}1&4&4&1\\2&4&4&2\\2&4&4&2\\1&4&4&1\end{bmatrix} f=⎣⎢⎢⎡​1221​4444​4444​1221​...
  • 关于离散傅里叶变换DFT),逆变换(IDFT)和卷积(Matlab + Python)的程序 温馨提示: DFT需要读取外部.txt文件,并且.txt文件只有一个要求:每行的数据数一致 2D卷积只有一个要求:2D数据矩阵大小>卷积内核大小...
  • 【图像处理】使用一维DFT叠加实现对图片的二维傅里叶变换 MATLAB 一维DFTDFT转化为矩阵运算 参考文档 Gamma公式展示 Γ(n)=(n−1)!∀n∈N\Gamma(n) = (n-1)!\quad\forall n\in\mathbb NΓ(n)=(n−1)!∀n∈N 是...
  • 5.2 矩阵变换 cv::dct(InputArraysrc,OutputArraydst, int flags=0) 执行一维或二维数组的正向或反向离散余弦变换。 该函数通过查看输入数组的标志和大小来选择操作模式: (1)如果(flags & DCT_INVERSE) ==...
  • 还可以利用矩阵的卷积运算等同于其在频域的乘法运算从而优化算法降低运算量, 即先将图像转换到频域,然后做完乘法运算后,再转换到图像域,opencv中的模板匹配就利用了这一特性降低运算量。 下面是dft例程的源码 #...
  • dft函数的作用是对一维或者二维浮点数数组进行正向或反向离散傅里叶变换 void dft(InputArray src,OutputArray dst,int flags =0,int nonzeroRows=0) 第一个参数:InputArray类型的src。输入矩阵,可以为实数或者...
  • DFT和IDFT分析

    千次阅读 2019-08-26 20:45:00
    DFT和IDFT分析DFT和IDFT的意义DFT的定义DFT矩阵分析 DFT和IDFT的意义 DFT:离散傅里叶变换 离散傅里叶变换可以将连续的频谱转化成离散的频谱去计算,这样就易于计算机编程实现傅里叶变换的计算。FFT算法的出现...
  • DFT在零点 $\underline{\mathcal{F}}\underline{f}(0) = \displaystyle{ \sum_{n=0}^{N-1}\underline{f}[n]e^{-2\pi i\frac{n0}{N}} = \sum_{n=0}^{N-1}\underline{f}[n] }$ 还记得傅里叶变换在零点处也有类似的...
  • DFT的属性

    2020-11-13 04:34:36
    利用DFT的向量/矩阵表示式:  也就是可以利用刻度为1/N的严的DFT计算离散傅立叶反变换。  1.实序列的DFT  现在来研究一下当输入序列是实数时,一些DFT(和FFT)计算的额外简化计算。在这种情况下,我们有...
  • 将上面两式写成矩阵形式,则有:对于正变换:对于反变换:在推导关系式时,经常需要用到的关系式:2 DFT与DTFT的关系通过采样从DTFT得到DFT已知DTFT的正变换为:对比DFT变换式:可知:N点DFT 就是 对DTFT以采样...
  • 用于计算正向傅立叶变换,逆傅立叶变换,离散余弦变换和傅立叶变换幅度的代码。 输入是大小为15X15的2D矩阵DFT / DFT.py文件具有函数“ forward_transform”,“ inverse_transform”,“ discrete_cosine_...
  • DFT:编写用于计算正向傅立叶变换,逆傅立叶变换,离散余弦变换和傅立叶变换幅度的代码。 程序的输入是大小为15X15的2D矩阵DFT / DFT.py:编辑函数“ forward_transform”,“ inverse_transform”,“ discrete_...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 155
精华内容 62
关键字:

dft变换矩阵