用C++在傅立叶空间中衍生
我有一个正弦波,我想转变为傅立叶空间。然后在傅立叶空间中取衍生物。然后将我的数据重新转换为真实空间。最后的阵列应该给我余弦。我从fftw.org使用了fft库。
我在第79行上遇到了3个错误:
E0137表达式必须是可修改的lvalue consoleapplication2 e2138表达必须具有算术或未上的枚举C型C 错误C2296'*':非法,左操作数具有'fftw_complex'
第79行的类型:
result2[l] = result1[l] * kappa[l] * sqrt(-1);
这是我的整个代码:
#include <fftw3.h>
#define N 64
#define L 30
int i;
int j;
int k;
enter code here
int l;
#include <stdio.h>
#include <math.h>
#define REAL 0
#define IMAG 1
void acquire_from_somewhere(fftw_complex* signal) {
for (i = 0; i < N; ++i) {
double x = (double)L / (double)N * (double) i - (double)L / 2;
signal[i][REAL] = sin(x);
}
}
void do_something_with(fftw_complex* result2) {
for (j = 0; j < N; ++j) {
double df = result2[j][REAL];
printf("%g\n", df);
}
}
int main() {
double kappa[N];
fftw_complex fhat[N];
fftw_complex dfhat[N];
fftw_complex signal[N];
fftw_complex result1[N];
fftw_complex result2[N];
fftw_plan plan1 = fftw_plan_dft_1d(N,
signal,
result1,
FFTW_FORWARD,
FFTW_ESTIMATE);
fftw_plan plan2 = fftw_plan_dft_1d(N,
dfhat,
result2,
FFTW_BACKWARD,
FFTW_ESTIMATE);
acquire_from_somewhere(signal);
fftw_execute(plan1);
for (k = -N; -N / 2 < k && N / 2 > k; ++k) {
kappa[k] = 2 * 3.14159265358979323846 * k / L;
}
for (l = 0; l < N; ++l) {
result2[l] = result1[l] * kappa[l] * sqrt(-1);
}
fftw_execute(plan2);
do_something_with(result2);
fftw_destroy_plan(plan1);
fftw_destroy_plan(plan2);
return 0;
}
I have a sine wave which I would like to transform into Fourier space. Then take derivative in Fourier space. Then transform my data back into real space. The final array should give me a cosine wave. I have used FFT library from FFTW.org.
I'm getting 3 errors on line 79 which are:
E0137 expression must be a modifiable lvalue ConsoleApplication2
E2138 expression must have arithmetic or unscoped enum type C
Error C2296 '*': illegal, left operand has type 'fftw_complex'
Line 79 is:
result2[l] = result1[l] * kappa[l] * sqrt(-1);
Here is my entire code:
#include <fftw3.h>
#define N 64
#define L 30
int i;
int j;
int k;
enter code here
int l;
#include <stdio.h>
#include <math.h>
#define REAL 0
#define IMAG 1
void acquire_from_somewhere(fftw_complex* signal) {
for (i = 0; i < N; ++i) {
double x = (double)L / (double)N * (double) i - (double)L / 2;
signal[i][REAL] = sin(x);
}
}
void do_something_with(fftw_complex* result2) {
for (j = 0; j < N; ++j) {
double df = result2[j][REAL];
printf("%g\n", df);
}
}
int main() {
double kappa[N];
fftw_complex fhat[N];
fftw_complex dfhat[N];
fftw_complex signal[N];
fftw_complex result1[N];
fftw_complex result2[N];
fftw_plan plan1 = fftw_plan_dft_1d(N,
signal,
result1,
FFTW_FORWARD,
FFTW_ESTIMATE);
fftw_plan plan2 = fftw_plan_dft_1d(N,
dfhat,
result2,
FFTW_BACKWARD,
FFTW_ESTIMATE);
acquire_from_somewhere(signal);
fftw_execute(plan1);
for (k = -N; -N / 2 < k && N / 2 > k; ++k) {
kappa[k] = 2 * 3.14159265358979323846 * k / L;
}
for (l = 0; l < N; ++l) {
result2[l] = result1[l] * kappa[l] * sqrt(-1);
}
fftw_execute(plan2);
do_something_with(result2);
fftw_destroy_plan(plan1);
fftw_destroy_plan(plan2);
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您要查找的答案是您的错误消息。您正在尝试将类型
fftw_complex
的元素与类型double
相乘。根据FFTW的网站,
fftw_complex
被定义为:typedef double fftw_complex [2];
这意味着
fftw_complex
是2个元素的数组double
。如果您只是想将这个复杂的数字乘以标量,我将把
result1 [i] < / code>视为2D向量,然后将x / y组件乘以
kappa [i]
(result1 [i] [0] * Kappa [i]
用于X组件)。顺便说一句,不要将小写L作为变量。这是通往未来头痛的快速道路。
The answer you're looking for is in your error message. You're trying to multiply an element of type
fftw_complex
with typedouble
.According to FFTW's website,
fftw_complex
is defined like so:typedef double fftw_complex[2];
This means
fftw_complex
is an array of 2 elements of typedouble
.If you're just trying to multiply this complex number with a scalar, I'd treat
result1[i]
as a 2D vector, and multiply the x / y components bykappa[i]
(result1[i][0] * kappa[i]
for x component).As an aside, don't use lowercase L as a variable. That's a quick road to future headaches.