FFT尺度功率谱
FFT scale power spectrum
我使用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%清楚,所以我可能会关闭,这可能不是你想要的-我一般会这样做,忽略你可能实际得到或使用的值范围。
假设你有绝对最小值和绝对最大值,vmin
和vmax
,你想把整个范围缩放到[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
,而是使用vmax
和vmin
的绝对最大值,并将其缩放到127而不是255。
另一方面,我认为你可以简化你的循环很多,可能节省一些处理时间(可能不可能取决于其他代码):
const unsigned int num = width * height;
for (unsigned int i = 0; i < num; i++)
temp[i] = f[i]->Mag();
另外,正如Oli在评论中提到的,你不应该在一开始就给singleValue
赋任何值,因为它会在以后被覆盖。
相关文章:
- 1D中的非均匀FFT正向和反向测试
- 如何编写计算功率的循环
- 多 GPU 批处理 1D FFT:似乎只有一个 GPU 可以工作
- 如何使用FFTW库C++计算3D阵列的FFT?
- FFT函数的参数是什么意思
- 2分频浮动功率的优化
- 关于FFTW3大师接口的困惑:3个同时复杂的FFT
- 2 接 x86_64 的快速浮点功率
- 定点功率功能
- Boost FFT示例-编译时出错,这段代码在做什么
- 寻求有关 FFT 模板的帮助
- 如何使用c++中的ipp库从信号中进行fft
- 意外输出:矢量矢量(功率集)
- 如何衡量代码更改的功率效率提高或减少
- 如何在 c++ 中使用 FFT 从 32 位浮点数组中提取频率
- FFT的研究 - 为什么它不快?
- 如何在FFT之后设置我的数组的频带
- 计算矩阵的第n个功率
- 如何将音频与功率谱同步并选择帧长度 N(执行 fft)
- FFT尺度功率谱