FFT尺度功率谱

FFT scale power spectrum

本文关键字:功率 FFT      更新时间:2023-10-16

我使用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;                 
            }
         }

假设temp 1-D数组的大小为值。我的问题是如何缩放大小的最小值和最大值,范围在[0 - 255)之间。

注:输入*f为已计算的2DFFT值,*输出值将填入幅度的最小值和最大值。

对编程有什么想法吗?

谢谢你,

问候,一郎

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

假设你有绝对最小值和绝对最大值,vminvmax,你想把整个范围缩放到[0;[55]你可以这样做:

// 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在评论中提到的,你不应该在一开始就给singleValue赋任何值,因为它会在以后被覆盖。