RudolfVonKrugstein

RudolfVonKrugstein

Dear Community,

I have a binary of float32 representing audio data with floats in the range of [-1,1].
I want this audio data converted into a binary of signed 16 bit integers.
What is an efficient way of doing this in elexir? I tried:

  def to_linear16(<<>>) do
    <<>>
  end

  def to_linear16(<<v::float-size(32), r::binary>>) do
    Logger.debug("#{inspect(v)}")
    f =
      if v < 0 do
        <<trunc(v * 0x8000)::size(16)>>
      else
        <<trunc(v * 0x7FFF)::size(16)>>
      end

    f <> to_linear16(r)
  end

But there is something wrong:

  • I get an no function clause matching in to_linear16/1 also I am only giving it data, that is definitly multples of 4 bytes long.
  • I check the intermediate results via logging of the float32 extracted form the binary and they are not what I expect. In fact, if I put the same binary into Nx.from_tensor(b,:f32) I get different results.

So I am very puzzled here.

  • What is an efficient way of doing this in elixir or am I already on the right track here?
  • What am I doing wrong in the pattern matching? I am always taking a 32bit float from the beginning of the binary.So how could the matching fail?

Thank you!

Showing Posts 1 to 3

dimitarvp

dimitarvp

Have you checked for endianness? Erlang assumes big-endian-arranged bytes when extracting floats the way you are doing it.

Demo:

bin = <<:math.pi()::float-32>> <> <<0, 0, 0>>
<<64, 73, 15, 219, 0, 0, 0>>

<<x::float-32, rest::binary>> = bin
<<64, 73, 15, 219, 0, 0, 0>>

x
3.1415927410125732

<<x::big-float-32, rest::binary>> = bin
<<64, 73, 15, 219, 0, 0, 0>>

x
3.1415927410125732

<<x::little-float-32, rest::binary>> = bin
<<64, 73, 15, 219, 0, 0, 0>>

x
-4.03314608963584e16

As you can see, by default big endian is used. So if your values are little-endian-arranged, you have to specify that explicitly.

In your example, try changing float-size(32) to little-float-size(32) and see if it works.

dimitarvp

dimitarvp

@RudolfVonKrugstein Thanks for accepting my answer. I think future readers (and myself) would still be curious to see how you solved your problem (with slight code edits), if you don’t mind?

RudolfVonKrugstein

RudolfVonKrugstein OP

Well, I solved it exactly as you said:

  def to_linear16(<<>>) do
    <<>>
  end

  # use littel-float-size here, as it seems our floats are littel endian
  def to_linear16(<<v::little-float-size(32), r::binary>>) do
    Logger.debug("#{inspect(v)}")
    f =
      if v < 0 do
        <<trunc(v * 0x8000)::size(16)>>
      else
        <<trunc(v * 0x7FFF)::size(16)>>
      end

    f <> to_linear16(r)
  end

I am still not sure, if this is an efficient way, but it works.

I might switch to the membrance framework, as it seems to have functionality like this build in.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews