我目前正试图从numpy中理解fft函数.为此,我测试了以下假设:
我有两个函数,f(x) = x^2和g(x) = f'(x) = 2*x.根据傅立叶变换定律和wolfram alpha,它应该是G(w) = 2pi*i*F(w)(前因子可以变化,但应该只有一个常数因子).在python中实现它时,我写道
import numpy as np
def x2(x):
return x*x
def nx(x):
return 2*x
a = np.linspace(-3, 3, 16)
a1 = x2(a)
a2 = nx(a)
b1 = np.fft.fft(a1)
b2 = np.fft.fft(a2)
c = b1/b2
Run Code Online (Sandbox Code Playgroud)
现在我期待一个几乎恒定的价值c,但我得到了
array([ 1.02081592e+16+0.j , 1.32769987e-16-1.0054679j ,
4.90653893e-17-0.48284271j, -1.28214041e-16-0.29932115j,
-1.21430643e-16-0.2j , 5.63664751e-16-0.13363573j,
-5.92271642e-17-0.08284271j, -4.21346622e-16-0.03978247j,
-5.55111512e-16-0.j , -5.04781597e-16+0.03978247j,
-6.29288619e-17+0.08284271j, 8.39500693e-16+0.13363573j,
-1.21430643e-16+0.2j , -0.00000000e+00+0.29932115j,
-0.00000000e+00+0.48284271j, 1.32769987e-16+1.0054679j ])
Run Code Online (Sandbox Code Playgroud)
我的错误在哪里,我该如何按照预期使用fft?
我有以下代码:
int byte_align(void * ptr)
{
int power = 2, n = 1, result = 0;
size_t address = reinterpret_cast<size_t>(ptr);
while(address%power == 0)
{
power *=2;
result = n;
n++;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
当我执行这个函数(在Ubuntu上用g ++ 4.6用-O3编译)时,我得到一个双变量,每次运行不同的值(4,5,7,8).为什么?在具有相同操作系统和相同编译器的另一台PC上,我总是得到3.
这些结果的其他可能原因是什么?
谢谢!
我想通过tcp over lan传输一些文件,所以我为TX-Part编写了以下代码:
void send_data(char * filename, char * dest)
{
try
{
boost::asio::io_service io_service;
char dest_t = *dest;
std::string adr = ip_adr_display[0] + ':' + boost::lexical_cast<std::string>(PORTNUM_TCP_IN);
std::cout << "Adress is: " << adr << " and file is: " << filename << '\n';
if(debugmode)
debug_global << adr << '\n';
std::string file = filename;
async_tcp_client client(io_service, adr, file);
io_service.run();
}
catch(std::exception& e)
{
};
};
Run Code Online (Sandbox Code Playgroud)
和RX部分:
void rec_data(void)
{
try
{
std::cout << "Receiving data...\n";
async_tcp_server *recv_file_tcp_server = new async_tcp_server(PORTNUM_TCP_IN); …Run Code Online (Sandbox Code Playgroud) 在我的程序中,我想读取几个文本文件(超过约800个文件),每个文件有256行,文件名从1.txt到n.txt,并在几个处理步骤后存储到数据库中.我的问题是数据的读取速度.通过使用OpenMP多线程读取循环,我可以将程序速度提高到以前的两倍.有没有办法加快速度?我的实际代码是
std::string CCD_Folder = CCDFolder; //CCDFolder is a pointer to a char array
int b = 0;
int PosCounter = 0;
int WAVENUMBER, WAVELUT;
std::vector<std::string> tempstr;
std::string inputline;
//Input
omp_set_num_threads(YValue);
#pragma omp parallel for private(WAVENUMBER) private(WAVELUT) private(PosCounter) private(tempstr) private(inputline)
for(int i = 1; i < (CCD_Filenumbers+1); i++)
{
//std::cout << omp_get_thread_num() << ' ' << i << '\n';
//Umwandlung und Erstellung des Dateinamens, Öffnen des Lesekanals
std::string CCD_Filenumber = boost::lexical_cast<string>(i);
std::string CCD_Filename = CCD_Folder + '\\' + CCD_Filenumber + ".txt"; …Run Code Online (Sandbox Code Playgroud) 我想在Qt中的单独文件中创建一个类,然后在我的主文件中使用此类(后台:辅助线程更新GUI).因此我写了ReadDPC.h-file:
class ReadDPC: public QThread
{
//First edit:
Q_OBJECT
//End of first edit
public:
void run();
signals:
void currentCount(int);
};
Run Code Online (Sandbox Code Playgroud)
在我的ReadDPC.cpp文件中:
void ReadDPC::run()
{
while(1)
{
usleep(50);
int counts = read_DPC();
emit currentCount(counts);
}
}
Run Code Online (Sandbox Code Playgroud)
read_DPC()是一个返回int-value 的函数,也放在cpp文件中.
但是当我想编译它时,我得到了错误undefined reference to ReadDPC::currentCount(int).为什么?我怎么解决这个问题?
编辑:添加Q_Object-Macro,没有解决方案.
我想在Python中实现的算法,但我不知道我应该使用fftshift(fft(fftshift(x))),只有当fft(x)(来自numpy的)。是否有基于输入数据形状的经验法则?
我使用fftshift而不是ifftshift因为vector中的值是偶数x。
我有一个包含“普通”代码和 CUDA 代码的项目。整个项目由cmake管理。现在,根据目标计算机上 CUDA 的可用性,我希望能够打开和关闭 CUDA 文件。为此,我打算使用 CMake 命令“ check_language”,并在以下CMakeLists文件中实现它:
cmake_minimum_required(VERSION 3.17)
set(PROJECT_NAME "Hello_World_with_CUDA")
set(PROJECT_VERSION 1.0.0)
project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} DESCRIPTION "UPPE pulse propagation library" LANGUAGES CXX)
include(GNUInstallDirs)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
check_language(CUDA)
if(CMAKE_CUDA_COMPILER)
enable_language(CUDA)
set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
add_compile_definitions(USE_CUDA)
else(CMAKE_CUDA_COMPILER)
message(STATUS "No CUDA support")
remove_definitions(USE_CUDA)
endif(CMAKE_CUDA_COMPILER)
cmake_policy (SET CMP0074 NEW)
set(PROJECT_SRC source/main.cpp source/test.cu)
set(PROJECT_INC include/test.hpp)
set(PROJECT_SRC ${PROJECT_SRC}
${PROJECT_INC})
add_executable(${PROJECT_NAME}
${PROJECT_SRC})
target_include_directories(${PROJECT_NAME} PRIVATE
include)
Run Code Online (Sandbox Code Playgroud)
尽管如此,我还是收到了错误
CMake Error at CMakeLists.txt:17 (check_language):
Unknown …Run Code Online (Sandbox Code Playgroud) 我只是尝试使用SSE扩展,我开始使用简单的矢量点乘法.所以我写了下面的代码:
void SSE_vectormult(double * A, double * B)
{
__m128d a;
__m128d b;
a = _mm_load_pd(A);
b = _mm_load_pd(B);
const int mask = 0xf1;
__m128d res = _mm_dp_pd(a,b,mask);
A = res;
}
Run Code Online (Sandbox Code Playgroud)
用A和B相同长度的矢量.现在,我必须将结果转换__m128d回来double.有没有简单的方法(或转换功能)?
谢谢!
我有一个带有浮点数据类型的numpy数组,但是extern函数需要一个复杂的数据类型。当我使用时a.view(np.complex),实际值也用于复杂值,从而弄乱了我的进一步计算,即:
a = [1, 2, 3]
b = a.view(np.complex)
> b = [1+1i, 2+2i, 3+3i]
Run Code Online (Sandbox Code Playgroud)
有没有让我得到的命令
> b = [1+0i, 2+0i, 3+0i]
Run Code Online (Sandbox Code Playgroud)
?