fftw c2c:转换后的真实数据中缺少对称性

2024-02-06

最近我遇到了一些关于fftw的使用及其c2c转换的问题(参见:3d c2c fft 与 fftw 库 https://stackoverflow.com/questions/10374656/3d-c2c-fft-with-fftw-library)。当我在使用 fftw lib 时发现问题时,我创建了一个新问题,以便以更具体的方式讨论这种情况。 由于我正在使用真实数据进行复杂到复杂的变换,因此傅里叶空间中的变换数据应该是对称的: F[n] = con(F[N-n])

现在,我对小块测试数据进行了一些转换,以检查转换后的数据的对称性。对于一维变换,每件事都按预期工作,但对于更高的维度,我得到了真正意想不到的结果。

我在用fftwf_plan_dft_2d将 8x8 灰度图像变换到傅立叶空间,复数结果由下式给出:

n 
0 real 7971 imag 0 
1 real -437.279 imag -802.151 
2 real -289 imag -566 
3 real -182.721 imag 15.8486 
4 real 31 imag 0 
5 real -182.721 imag -15.8486 
6 real -289 imag 566 
7 real -437.279 imag 802.151 
8 real -1499.79 imag -315.233 
9 real 182.693 imag -74.5563 
10 real 55.9239 imag -12.8234 
11 real -84.7868 imag -9.10052 
12 real -14.4264 imag 211.208 
13 real 289.698 imag 214.723 
14 real 452.659 imag -246.279 
15 real 1136.35 imag -763.85 
16 real 409 imag -134 
17 real -141.865 imag 42.6396 
18 real -33 imag 122 
19 real 129.075 imag -49.7868 
20 real 1 imag -150 
21 real 109.865 imag -84.6396 
22 real 95 imag -142 
23 real -841.075 imag -92.2132 
24 real -108.207 imag -89.2325 
25 real -127.213 imag 28.8995 
26 real -36.6589 imag -8.27922 
27 real -74.6934 imag 43.4437 
28 real 70.4264 imag 29.2082 
29 real -88.3545 imag -81.8499 
30 real -127.924 imag -190.823 
31 real 230.302 imag 8.7229 
32 real -53 imag 0 
33 real -73.1127 imag -22.8578 
34 real -85 imag -82 
35 real -10.8873 imag 51.1421 
36 real -65 imag 0 
37 real -10.8873 imag -51.1421 
38 real -85 imag 82 
39 real -73.1127 imag 22.8578 
40 real -108.207 imag 89.2325 
41 real 230.302 imag -8.7229 
42 real -127.924 imag 190.823 
43 real -88.3545 imag 81.8499 
44 real 70.4264 imag -29.2082 
45 real -74.6934 imag -43.4437 
46 real -36.6589 imag 8.27922 
47 real -127.213 imag -28.8995 
48 real 409 imag 134 
49 real -841.075 imag 92.2132 
50 real 95 imag 142 
51 real 109.865 imag 84.6396 
52 real 1 imag 150 
53 real 129.075 imag 49.7868 
54 real -33 imag -122 
55 real -141.865 imag -42.6396 
56 real -1499.79 imag 315.233 
57 real 1136.35 imag 763.85 
58 real 452.659 imag 246.279 
59 real 289.698 imag -214.723 
60 real -14.4264 imag -211.208 
61 real -84.7868 imag 9.10052 
62 real 55.9239 imag 12.8234 
63 real 182.693 imag 74.5563

很抱歉这么长的数据列表,但它显示了我的问题。

例如对于F[3]=-182.721 + 15.8486i我期望F[64-3] = F[61] = -182.721 - 15.8486i,但正如你所看到的-84.7868 + 9.10052i。相反,共轭F[3]位于索引 5。其他对也是如此。

如果有系统我找不到它。

这是完整的代码:

QImage image("/Users/wolle/Desktop/wolf.png");
int w = image.width();
int h = image.height();
int size  = w * h;

cl_float *rawImage = imageToRaw(image); // converts a QImage into an rgb array [0..255]

fftwf_complex *complexImage = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * size);
fftwf_complex *freqBuffer = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * size);

// real data to complex data
for (int i = 0; i < size; i++)
{
    complexImage[i][0] = (float)rawImage[i];
    complexImage[i][1] = 0.0f;
}

fftwf_plan forward = fftwf_plan_dft_2d(w, h, complexImage, freqBuffer, FFTW_FORWARD, FFTW_ESTIMATE);

fftwf_execute(forward);

for (int y = 0; y < h; y++)
{
    for (int x = 0; x < w; x++)
    {
        int gid = y * w + x;
        qDebug() << gid  << "real" << freqBuffer[gid][0] << "imag" << freqBuffer[gid][1];
    }
}

我希望得到一些帮助。 :-D

问候

Wolf


对于 2D 傅立叶变换,当 x 为实数时,FFT(x) 仍然是共轭对称的。但这是二维的。因此索引 16*x+y 处的 (x,y) 元素应该是索引 16*(16-x mod 16)+(16-y mod 16) 处的 (16-x,16-y) 元素的共轭,当 y 不为 0 时,为 272-16*x-y mod 256。

但我认为虽然你说的是 16x16,但实际上你的意思是 8x8。因此,8*x+y 处的 (x,y) 与 8*(8-x mod 8) + (8-y mod 8) 处的 (8-x,8-y) 共轭。

特别是,例如,当 x=0 时,共轭元素是 y 和 8-y——例如,包括 3 和 5,正如您所发现的。

(当 x=0 或 y=0 时,上面的“8-y mod 8”表示 0。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fftw c2c:转换后的真实数据中缺少对称性 的相关文章

  • 傅里叶变换+emgucv

    谁能告诉我这段代码有什么问题吗 基本上我正在尝试计算图像的 dft 并将其显示为屏幕上的图像 Image
  • 对真实输入数据进行高效的 2D FFT?

    我目前正在使用 opencl 对真实输入数据实现二维 FFT 更具体地说是使用 FFT 的快速 2D 卷积 所以我只需要一些行为足够相似的东西来应用卷积 2D FFT 是在行上使用 1D FFT 然后在列上使用 1D FFT 来实现的 为了
  • 我应该如何在这个 2d Java 游戏中实现跳跃/重力/下落

    所以这是我的Player类 我想在空格键上跳转的对象 我只是不知道从哪里开始 我可以在互联网上阅读与我相关的任何好的资源吗 任何帮助都很棒 谢谢 package com zetcode import java awt Color impor
  • Java 2D 图像调整大小忽略双三次/双线性插值渲染提示(OS X + linux)

    我正在尝试使用 Image Voodoo 插件在 JRuby Rails 应用程序中为上传的图像创建缩略图 问题是调整大小的缩略图看起来像 屁股 似乎生成缩略图的代码绝对正确地执行了所有操作 将插值渲染提示设置为 双三次 但在我们的开发环境
  • 如何使用python将一幅图像的相位和不同图像的幅度组合成一幅图像

    我想将一幅图像的相位谱和不同图像的幅度谱组合成一幅图像 我得到了图像A和图像B的相位谱和幅度谱 这是代码 f np fft fft2 grayA fshift1 np fft fftshift f phase spectrumA np an
  • d引用二维数组

    请看这段代码 include
  • 如何在 2D 中的 2 个点之间创建一条曲线并获取每隔 d 距离形成该曲线的点?

    我数学不好 我有2点 A x1 y1 and B x2 y2 in 2D 我需要从点创建一条虚拟路径A to B在 R 半径 处弯曲 然后返回描述该弯曲路径的点数组 并非所有点都彼此相距 D 距离 在Java中我需要这样的方法 privat
  • 更改Android自定义SurfaceView的大小

    我正在尝试为 Android 应用程序创建 2D 游戏引擎 我已经关注了本教程 http www droidnova com 2d tutorial series part ii 772 html 这对于创建全屏显示效果很好 但我不想要这样
  • 获取 Librosa 中与 STFT 相关的频率

    使用时librosa stft 要计算频谱图 如何获取相关的频率值 我对生成图像不感兴趣 如librosa display specshow 而是我希望掌握这些价值观 y sr librosa load recordings high pi
  • 操作系统如何在屏幕上绘制窗口?

    经过多年的计算机使用和编程 我意识到实际在屏幕上绘制的软件堆栈对我来说基本上是一个谜 我曾研究过一些嵌入式 LCD GUI 应用程序 我认为这为简化堆栈提供了一些线索 但对于 Windows 操作系统之类的东西的整体情况仍然模糊 据我所知
  • 计算 2D 向量叉积

    来自维基百科 叉积是a中两个向量的二元运算三维欧几里得空间产生另一个向量 该向量垂直于包含两个输入向量的平面 鉴于该定义仅定义为三个 或七 一和零 https en wikipedia org wiki Seven dimensional
  • 灰度图像到 NumPy 数组进行傅里叶变换

    目前我正在使用 PIL 和 NumPy 我有一个彩色的png图像 我想要 以灰度读取 转换为 NumPy 数组 对阵列执行 FFT 显示图像 这就是我正在尝试的 在 IPython w pylab flag In 1 import Imag
  • 如何从 .wav 文件中提取特定频率范围?

    I m really声音处理方面的新知识 所以也许我的问题很简单 我想要做的是使用 R 从 wav 文件中提取特定的频率范围 假设为 150 400 Hz 换句话说 我想创建另一个波形文件 wave2 其中仅包含我想要的频率分量 指定 15
  • 将变量从 Activity 传递到自定义视图类

    我正在测试使用将音频绘制到画布中canvas drawLine 方法 我能够在画布上进行静态绘制 基本上我有一个测试应用程序 它有两个按钮 开始 和 停止 和一个画布 我试图在其中绘制从 FFT 获得的音频频率 当我按下开始按钮时 它开始使
  • C 中的二维傅里叶变换

    我使用该网站的方程实现了 2D DFT 和 IDFThttp homepages inf ed ac uk rbf HIPR2 fourier htm http homepages inf ed ac uk rbf HIPR2 fourie
  • 如何用 Java 为 2D 游戏构建 Tiled 地图?

    不知道如何解决这个问题 基本上 我想要 400x400 窗口的 Pixel gt Tile 表示 屏幕上的每个坐标 例如120x300应该是图块的一部分 我最小的精灵是 4 个像素 所以我们可以说 1 个图块 4 个像素 玩家和敌人精灵都是
  • NumPy 中 exp(-x^2) 的快速傅立叶变换

    I have to calculate numerically the 2nd derivative of a Gaussian function I ve read every question on this topic here bu
  • 如何从傅里叶变换绘制频谱

    我想绘制音乐文件的频谱 就像他们在 Audacity 中所做的那样 因此 我希望 x 轴上以赫兹为单位的频率 y 轴上以振幅 或 desibel 为单位 我将歌曲 大约 2000 万个样本 分成一次 4096 个样本的块 这些块将产生 20
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 二维数组的 MPI 数据类型

    我需要将一个整数数组的数组 基本上是一个二维数组 从根传递给所有处理器 我在 C 程序中使用 MPI 如何声明二维数组的 MPI 数据类型以及如何发送消息 我应该使用广播还是分散 你需要使用播送 http www netlib org ut

随机推荐