You are right. fftw says that in float precision, it accepts float inputs to the API. I assume they mean the libfftwf.so library and the fftwf_* API. I didn't specify precision in my build. So I got libfftw.so (as opposed to libfftwf.so or libfftwl.so). This simplified Makefiles and source code:) I/O with fftw_complex is still 16 B. A quick and dirty test with libfftw3.so and complexf I/O resulted with memory corruption.
I'll have to investigate this better and use the libfftwf.so library and fftwf api, when I have more time. I will update this thread when I do:) Thx again, Nikos On Mon, May 12, 2025 at 6:10 AM Nikos Balkanas <nbalka...@gmail.com> wrote: > Thx.I will check it:) > > On Mon, May 12, 2025 at 5:53 AM Marcus D. Leech <patchvonbr...@gmail.com> > wrote: > >> On 11/05/2025 22:45, Nikos Balkanas wrote: >> >> Yes it is, But input is always double:( >> >> BR >> Nikos >> >> Nope. >> >> https://www.fftw.org/fftw3_doc/Precision.html >> >> The FFTW3F routines used in Gnu Radio take in single-precision (32-bit) >> and output single-precision (32-bit). In most CPUs, >> the 64-bit floating-point pathways are slower than 32-bit pathways, >> which is why FFTW3 has a version of the libraries that >> process single-precision floating-point exclusively. This has been >> true literally for at least two decades of FFTW3, since I >> started using and contributing to Gnu Radio in 2004. >> >> Anyway, it's entirely up to you, but there's really no reason to use >> double-precision floats to process data that on the >> wire are only 16 bits. >> >> >> >> On Mon, May 12, 2025 at 5:38 AM Marcus D. Leech <patchvonbr...@gmail.com> >> wrote: >> >>> On 11/05/2025 22:27, Nikos Balkanas wrote: >>> >>> Thx Marcus, >>> >>> I worked it out 2 days ago. Just my memory allocation. >>> I am passing input buffer with a global pointer. >>> I was using global stack allocation. When I switched to >>> malloc, it just works fine:) >>> Here is what happened: Input buffs didn't reach the _recv_one_packet() >>> where >>> b was evaluated to nil and therefore out_buffs were allocated to nil. It >>> would be helpful >>> to check allocations like these and issue a warning. >>> Input, however, still reached the convert_chdr_1_to_fc64_1_guts but >>> outputs and therefore output were evaluated to NULL. >>> With NULL output it was sent through the guts function. >>> Even commenting out the switch and sending it through >>> the generic chdr_sc16_to_xx crashed it with no output buffers:( >>> I am not quite sure why b is not evaluated in _recv_one_packet() >>> and is available downstream in convert_chdr_1_to_fc64_1_guts >>> with a global stack allocation. Unstable code? >>> >>> Anyway, I need the complex double for libfftw3. Its >>> input data is (fftw_complex) aka 16 B, no matter >>> what precision I use. It comes out in float, long double >>> and quad flavors, but input is the same. >>> And it blows Opencl fft I was using by 10x! >>> on the filesystem, less with live signals, >>> but still faster:) And signal power is hotter:) >>> >>> BR >>> Nikos >>> >>> FFTW3 is available in a single-precision instance -- Gnu Radio uses >>> it. FFTW3F. >>> >>> >>> >>> On Mon, May 12, 2025 at 4:24 AM Marcus D. Leech <patchvonbr...@gmail.com> >>> wrote: >>> >>>> On 10/05/2025 07:17, Nikos Balkanas wrote: >>>> >>>> It turns out that the problem is not just bypassing the sse2 code:( >>>> After commenting it out, uhd still crashes. The conversion output >>>> buffers are not created in _recv_one_packet() >>>> Any ideas why they don't? >>>> >>>> TIA >>>> Nikos >>>> >>>> This should *Just work*. >>>> >>>> What happens if you use rx_samples_to_file and specify: >>>> >>>> --type double >>>> >>>> This should write out double-precision (64-bit) complex floats to the >>>> output file. You should be able to use that example >>>> code as a bit of a template. >>>> >>>> Also, I have to ask, why double precision? Even single-precision float >>>> has more precision and dynamic range than is >>>> actually represented by the 16-bit values on the wire, coming from >>>> the ADCs. By moving to double-precision, unless you >>>> have a library that only supports double-precision math, you're just >>>> slowing down your computations for no good reason. >>>> >>>> >>>> >>>> >>>> >>>> On Sat, May 10, 2025 at 7:56 AM Nikos Balkanas <nbalka...@gmail.com> >>>> wrote: >>>> >>>>> Hi all, >>>>> >>>>> I recently changed my host application to complex double. I had to >>>>> change my stream_args to >>>>> fc64. I pass my void pointer to uhd_rx_streamer_recv same as before: >>>>> ptr = (void **)&zin; >>>>> Unfortunately, the convert_chdr_1_to_fc64_1_guts doesn't like it, I >>>>> have only 1196 maxsamples, and crashes. I don't need the sse2 code for my >>>>> conversion. I only use 1024 complex >>>>> samples/packet for fft. I am very happy with the >>>>> generic chdr_sc16_to_xx. >>>>> Does anyone have any fc64 experience and how one can pass the void >>>>> buffer pointer to >>>>> skip the sse2 code? >>>>> >>>>> TIA >>>>> Nikos >>>>> >>>> >>>> _______________________________________________ >>>> USRP-users mailing list -- usrp-users@lists.ettus.com >>>> To unsubscribe send an email to usrp-users-le...@lists.ettus.com >>>> >>>> >>>> _______________________________________________ >>>> USRP-users mailing list -- usrp-users@lists.ettus.com >>>> To unsubscribe send an email to usrp-users-le...@lists.ettus.com >>>> >>> >>> >>
_______________________________________________ USRP-users mailing list -- usrp-users@lists.ettus.com To unsubscribe send an email to usrp-users-le...@lists.ettus.com