小编Goz*_*Goz的帖子

MSVC下的奇数优化问题

我见过这个博客:

http://igoro.com/archive/gallery-of-processor-cache-effects/

第7部分中的"古怪"引起了我的兴趣.

我的第一个想法是"那就是C#很奇怪".

它不是我写的以下C++代码.

volatile int* p = (volatile int*)_aligned_malloc( sizeof( int ) * 8, 64 );
memset( (void*)p, 0, sizeof( int ) * 8 );

double dStart   = t.GetTime();

for (int i = 0; i < 200000000; i++)
{
    //p[0]++;p[1]++;p[2]++;p[3]++;  // Option 1
    //p[0]++;p[2]++;p[4]++;p[6]++;  // Option 2
    p[0]++;p[2]++;                  // Option 3
}

double dTime    = t.GetTime() - dStart;
Run Code Online (Sandbox Code Playgroud)

我在2.4 Ghz Core 2 Quad上的时间如下:

Option 1 = ~8 cycles per loop.
Option 2 = ~4 cycles per loop.
Option …
Run Code Online (Sandbox Code Playgroud)

c++ optimization x86 assembly

13
推荐指数
1
解决办法
875
查看次数

是否有正确处理Unicode的STL字符串类?

我知道所有关于std :: string和std :: wstring但他们似乎并没有完全注意UTF-8和UTF-16的扩展字符编码(至少在Windows上).也不支持UTF-32.

那么有谁知道提供完整的UTF-8,UTF-16和UTF-32支持的跨平台直接替换类?

c++ unicode stl unicode-string

13
推荐指数
3
解决办法
7398
查看次数

将FFT转换为谱图

我有一个音频文件,我正在遍历文件,每步取512个样本,然后通过FFT.

我将数据输出为块514浮动(使用IPP的ippsFFTFwd_RToCCS_32f_I),其中实部和虚部交错.

我的问题是,一旦我拥有这些复杂数字,我该怎么办?目前我正在为每个价值做

const float realValue   = buffer[(y * 2) + 0];
const float imagValue   = buffer[(y * 2) + 1];
const float value       = sqrt( (realValue * realValue) + (imagValue * imagValue) );
Run Code Online (Sandbox Code Playgroud)

这提供了一些稍微有用的东西,但我更倾向于在0到1的范围内获得值.上面的问题是峰值最终会回到9或更多.这意味着事情会恶化饱和,然后光谱图的其他部分几乎不会出现,尽管当我通过试听的频谱图运行音频时它们看起来非常强大.我完全承认我不是100%确定FFT返回的数据是什么(除了它代表我传入的512个样本长块的频率值).特别是我的理解是缺乏compex数字代表什么.

任何建议和帮助将不胜感激!

编辑:只是为了澄清.我的一个大问题是,如果不知道比例是什么,返回的FFT值是没有意义的.有人能指出我制定这种规模吗?

Edit2:通过执行以下操作,我得到了非常好看的结果:

size_t count2   = 0;
size_t max2     = kFFTSize + 2;
while( count2 < max2 )
{
    const float realValue   = buffer[(count2) + 0];
    const float imagValue   = buffer[(count2) + 1];
    const float value   = (log10f( sqrtf( (realValue * realValue) + (imagValue * …
Run Code Online (Sandbox Code Playgroud)

c++ fft spectrogram intel-ipp

12
推荐指数
4
解决办法
9938
查看次数

用户模式USB从设备到主机的同步传输

我目前正在尝试与用户陆地的USB音频设备连接.我现在已经完全枚举了设备,并且我已经设置了接口并将接口设置为接口非零带宽备用接口.

首先,我不得不说我不能使用像libusb这样的东西.我想通过Linux的USB设备文件系统来做到这一点.

所以据我所知,我已经准备好开始接收等时数据了.但是我找不到关于如何进行等时传输的信息.

据我所知,我需要填充一个usbdevfs_urb结构,但我完全不确定如何填充这个结构.

此外,一旦我填写了这个结构,我认为我需要调用以下内容:

int retSubmit   = ioctl( fd, USBDEVFS_SUBMITURB, &usbRequest );
Run Code Online (Sandbox Code Playgroud)

然后一旦提交,我可以等待请求完成使用

USBDEVFS_REAPURBNDELAY
Run Code Online (Sandbox Code Playgroud)

在REAPURBNDELAY的情况下,我需要传递的参数究竟是什么?

我甚至吠叫正确的树?

任何信息都将受到大力赞赏.

提前致谢!

编辑:

我尝试按如下方式进行等时传输:

usbdevfs_urb&   urbRequest      = *(usbdevfs_urb*)malloc( 384 );
urbRequest.type                 = USBDEVFS_URB_TYPE_ISO;
urbRequest.endpoint             = mpEndpoint->GetEndpointAddress();//mpEndpoint->GetEndpointIndex();
urbRequest.status               = 0;
urbRequest.flags                = USBDEVFS_URB_ISO_ASAP;
urbRequest.buffer               = pData;
urbRequest.buffer_length        = 0;
urbRequest.actual_length        = 0;
urbRequest.start_frame          = 0;
urbRequest.number_of_packets    = 1;
urbRequest.error_count          = 0;
urbRequest.signr                = 0;
urbRequest.usercontext          = pData;

usbdevfs_iso_packet_desc* pIsoPacketDesc    = &urbRequest.iso_frame_desc[0];
pIsoPacketDesc->length          = 384;
pIsoPacketDesc->actual_length   = 0;
pIsoPacketDesc->status          = 0;
Run Code Online (Sandbox Code Playgroud)

不幸的是,这给了我一个-28(ENOSPC)的错误.

<7>[ 3184.243163] usb …
Run Code Online (Sandbox Code Playgroud)

c linux usb

11
推荐指数
1
解决办法
5820
查看次数

NAT背后的NAT连接

我遇到了一个有趣的问题.基本上我有两部手机都在NAT之后.我想使用UDP直接在2台设备之间进行通信.

我知道如果我发起从电话到服务器的连接,那么我可以将数据推回到与电话的连接(即从收到消息的同一端口将其发送回收到的相同IP和端口) .所以我可以通过将两部手机连接到服务器来轻松地在两台设备之间进行通信.然后将数据发送到服务器并将其重新路由回电话.这绕过了我可能遇到的任何NAT遍历问题.

但是我宁愿只使用服务器将2个设备指向对方,然后让它们直接通信.我该怎么做呢?是否可以不使用像uPnP这样的东西?

任何帮助都会很有用!

编辑:我发现这个文件http://www.brynosaurus.com/pub/net/p2pnat/它看起来像发夹翻译是我所追求但它看起来并没有被广泛支持.我想知道移动ISP对UPnP的支持有多好?

mobile p2p udp nat nat-traversal

10
推荐指数
1
解决办法
6066
查看次数

UserControl集合未标记为可序列化

我必须遗漏一些非常明显的东西.我是C#的新手,但已经用C/C++编程多年了,很抱歉,如果这是一个非常明显的东西;)

[请参阅编辑以获取新问题]

我正在尝试创建一个包含UserControl的节点.我有控件出现在WinForm设计器中,我可以添加节点.但是,当我尝试运行代码时,我收到以下错误:

属性"节点"的代码生成失败.错误是:程序集'应用程序中的'Type App.Node',版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null'未标记为可序列化.

然后我添加的节点都没有显示出来.

这开始让我发疯,据我所知,它被标记为可序列化.

该节点定义如下:

[Serializable]
public class Node : MarshalByRefObject
{
    public Node()
    {
    }

    public Node( String text )
    {
        this.Text       = text;
        this.Checked    = false;
        this.Complete   = false;
    }

    public String       Text        { get; set; }
    public bool         Checked     { get; set; }
    public bool         Complete    { get; set; }
    public bool         Selected    { get; set; }
};
Run Code Online (Sandbox Code Playgroud)

然后我定义一个"集合"如下:

[Serializable]
public class NodeCollection : List< Node >
{
    public …
Run Code Online (Sandbox Code Playgroud)

c# collections user-controls properties serializable

10
推荐指数
1
解决办法
1万
查看次数

线程本地存储和iOS

我的理解是iOS不支持__thread.显然,有一种方法可以使用pthread_setspecific.但是,是否已经有一个已实现此功能的模板类?

我不得不重新发明轮子,特别是因为它不是一段简单的代码.

任何链接将非常感谢!

干杯

c++ templates pthreads thread-local-storage ios

9
推荐指数
1
解决办法
5231
查看次数

在Android NDK r8b下编译STXXL

我正在尝试在Android NDK r8b下编译STXXL(我在新的r8c btw下遇到了同样的问题).

我正在使用gnustl_static进行编译.

我需要C++ 11支持,所以最初我尝试设置

LOCAL_CPPFLAGS := -std=c++11
Run Code Online (Sandbox Code Playgroud)

但是这引起了关于uint64_t的错误.

所以我把旗子改成了

LOCAL_CPPFLAGS :=-std=gnu++11
Run Code Online (Sandbox Code Playgroud)

这有点帮助,但是当它开始编译时,我得到一个与gnu stl有关的错误.

Users/Gozzeh/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/stxxl/STXXL/algo/copy_and_sort_file.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__  -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -I/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include -I/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/include -Ijni -DANDROID  -Wa,--noexecstack -fexceptions -frtti -Dnullptr=0 -D_ANDROID -std=gnu++11 -Ijni/STXXL/include -fexceptions  -O2 -DNDEBUG -g   -I/Users/Gozzeh/android-ndk-r8b/platforms/android-8/arch-arm/usr/include -c  jni/STXXL/algo/copy_and_sort_file.cpp -o ./obj/local/armeabi/objs/stxxl/STXXL/algo/copy_and_sort_file.o 
In file included from /Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/set:60:0,
                 from jni/STXXL/include/stxxl/bits/io/simdisk_file.h:33,
                 from jni/STXXL/include/stxxl/bits/io/io.h:20,
                 from jni/STXXL/include/stxxl/io:13,
                 from jni/STXXL/algo/copy_and_sort_file.cpp:18:
/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h: In member function 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, …
Run Code Online (Sandbox Code Playgroud)

c++ android stl android-ndk stxxl

9
推荐指数
1
解决办法
1943
查看次数

基于calcOpticalFlowFarneback的OpenCV变形图像

我正在尝试使用Dense Optical Flow执行复杂的图像扭曲(我试图将第二个图像切换成与第一个图像大致相同的形状).我可能会把这一切都搞错了但是我发布了我尝试过的内容:

cv::Mat flow;
cv::calcOpticalFlowFarneback( mGrayFrame1, mGrayFrame2, flow, 0.5, 3, 15, 3, 5, 1.2, 0 );

cv::Mat newFrame = cv::Mat::zeros( frame.rows, frame.cols, frame.type() );
cv:remap( frame, newFrame, flow, cv::Mat(), CV_INTER_LINEAR );
Run Code Online (Sandbox Code Playgroud)

如果我正在计算2个灰度帧的流量垫的想法.我找回了一个似乎有意义的流垫,但现在我正在尝试使用此流信息重新映射我的原始(即非灰度)图像.

我认为重映射功能是我想要的,但是我得到了一个非常严重失真的图像.我的所有颜色信息都没有存在.我最终得到的橙色和黑色图像与我的原始图像有很小的相似之处.

我猜我错误地理解了重映射功能,它要么不做我想做的事情,要么就是因为我传入的内容出了问题.

如果前者有人对我如何解决这个问题有任何建议?如果是后者,我错了什么?

任何帮助非常感谢!

c++ opencv opticalflow image-stabilization

9
推荐指数
1
解决办法
7950
查看次数

Float32到Float16

有人可以向我解释如何将32位浮点值转换为16位浮点值吗?

(s =符号e =指数,m =尾数)

如果32位浮点数是1s7e24m
而16位浮点数是1s5e10m

那么这么简单吗?

int     fltInt32;
short   fltInt16;
memcpy( &fltInt32, &flt, sizeof( float ) );

fltInt16 = (fltInt32 & 0x00FFFFFF) >> 14;
fltInt16 |= ((fltInt32 & 0x7f000000) >> 26) << 10;
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
Run Code Online (Sandbox Code Playgroud)

我假设它不是那么简单......所以有人能告诉我你需要做什么吗?

编辑:我看到我的指针转移错误了...所以这会更好吗?

fltInt16 =  (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x7c000000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
Run Code Online (Sandbox Code Playgroud)

我希望这是正确的.如果我遗漏了一些明显的话,我会道歉.它在星期五晚上几乎是午夜......所以我不是"完全"清醒;)

编辑2:哎呀.又把它弄错了.我想失去前3位而不是更低!那怎么样:

fltInt16 =  (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x0f800000) >> …
Run Code Online (Sandbox Code Playgroud)

c floating-point

8
推荐指数
2
解决办法
1万
查看次数