【问题标题】:FFT scale power spectrumFFT 标度功率谱
【发布时间】:2011-11-27 06:18:57
【问题描述】:

我无法使用 FFT 扩展图像的功率谱。代码如下

void spectrumFFT(Complex<double> *f, Complex<double> *output, int width, int height){

        Complex<double> *temp = new Complex<double>[width * height];
        Complex<double> *singleValue = new Complex<double>();            

        for(int j = 0; j < height; j++){
            for(int i = 0; i < width; i++){
                 singleValue = f[i + j * width];
                 Complex<double> tempSwap = singleValue->Mag();
                 // tempSwap assign Magnitude value from singleValue

                 temp[i + j * width] = tempSwap;                 
            }
         }

假设一维临时数组填充了幅度值。我的问题是如何扩展在 [0 - 255) 之间的幅度的最小值和最大值。

注意:输入 *f 已经是 2DFFT 的计算值,*输出值将填充大小的最小值和最大值。

对编程有什么想法吗?

谢谢,

问候, 一郎

【问题讨论】:

  • 您有两个内存泄漏: (1) 您正在初始化 singleValue 以指向动态创建的 Complex&lt;double&gt;,然后立即将其指向其他东西。 (2) 你永远不会用temp 做任何事,也永远不会用delete-ing 它。
  • 您的问题不清楚。您是说要缩放数据,使最小值始终为 0,最大值始终为 255?
  • 猜猜我们只是缺少一些代码(temp 被填充,后来被删除,函数范围没有右括号)。
  • 忽略上面提到的temp - 误读了一行。

标签: c++ image-processing fft


【解决方案1】:

您的问题不是 100% 清楚,所以我可能会离开,这可能不是您想要的 - 我一般会这样做,忽略您可能实际获得或使用的价值范围。

假设您有绝对最小值和绝对最大值 vminvmax 并且您想将整个范围缩放到 [0; 255] 你可以这样做:

// move the lower end to 0
double mod_add = -vmin;
double mod_mul = 255 / (vmax + mod_add);

现在,将一个值重新排列到我们计算的范围内:

double scaled = (value + mod_add) * mod_mul;

mod_add 将负数/值移动到正范围(绝对最小值将变为 0),mod_mul 将缩放整个范围(从绝对最小值到绝对最大值)以适应 [0; 255]。如果没有负值,您显然可以跳过mod_add。如果您想保持 0 居中(即 127),则必须跳过 mod_add 而是使用 vmaxvmin 的绝对最大值并将其缩放为 127 而不是 255。


附带说明,我认为您可以大大简化循环,可能会节省一些处理时间(可能无法实现,具体取决于那里的其他代码):

const unsigned int num = width * height;
for (unsigned int i = 0; i < num; i++)
    temp[i] = f[i]->Mag();

此外,正如 Oli 在 cmets 中所提到的,您不应该在开始时为 singleValue 分配任何值,因为它稍后会被覆盖。

【讨论】:

  • 嗨 Oli 和 Mario,感谢您的建议和评论。是的,我想在 0 到 255 之间缩放,以便在数据范围内为 8 位。我在 C++ 编程方面很差,几乎 11 年我没有接触过 C++。感谢您指出内存泄漏。由于这种编码,我感到此应用程序中存在内存泄漏。我会在测试后给出结果。谢谢
  • 如果您希望看到任何感兴趣的东西,您将需要获取 FFT 频谱幅度的对数,否则您将在 255 附近获得几个点,其余为 0。跨度>
  • 嗨马里奥,它只显示了一行,它与演示应用程序不是 100% 匹配。我为查找最小值和最大值所做的是创建另一个循环并将每个值与 temp[i] 进行比较以找到最小值和最大值,例如 0 - 18866,之后我使用您的代码并创建另一个循环,我将计算的比例值放入其中此循环并将值分配给 * 输出。我真正想要的是“值归一化到 [0, 255] 范围的缩放功率谱”
  • 应该得到你想要的,只需考虑 jeff7 关于对数缩放的评论,这可能会破坏价值分配。
  • 嗨杰夫,你有任何样本,如何对 FFT 谱的幅度进行日志记录?谢谢
猜你喜欢
  • 1970-01-01
  • 2017-07-29
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多