WEBVTT

00:00.000 --> 00:09.000
And since then, only new features have been added.

00:09.000 --> 00:15.000
So, this is how SGR++ works in the inside.

00:15.000 --> 00:19.000
You first have the source, which is your SGR device or file,

00:19.000 --> 00:21.000
or it can really be anything.

00:21.000 --> 00:23.000
Then you've got a pre-processing step,

00:23.000 --> 00:28.000
which just pre-process is the IQ with various algorithm that can be useful,

00:28.000 --> 00:32.000
like decimation, for example, increase dynamic range,

00:32.000 --> 00:36.000
or spectrum inversion, if you're receiving from,

00:36.000 --> 00:41.000
for example, a downconverter, which has spectrum inversion,

00:41.000 --> 00:43.000
so we can correct for it.

00:43.000 --> 00:47.000
And the IQ correction, to correct for IQ balance and DC offset,

00:47.000 --> 00:49.000
stuff like that.

00:49.000 --> 00:55.000
The next step is channelization, where various signals are downconverted,

00:56.000 --> 01:02.000
and prepared for use by each decoder, or even recorder,

01:02.000 --> 01:04.000
or anything, any module.

01:04.000 --> 01:08.000
And then, these modules, if they output audio,

01:08.000 --> 01:13.000
they output it to a sync system, where other modules can actually use

01:13.000 --> 01:16.000
the outputs from these modules.

01:16.000 --> 01:19.000
An example of that would be the code for example,

01:19.000 --> 01:24.000
it can redirect you from an audio stream.

01:25.000 --> 01:30.000
So, I'm going to go through each of the steps

01:30.000 --> 01:33.000
that you saw in the log diagram of the software,

01:33.000 --> 01:36.000
and the first of that is resource,

01:36.000 --> 01:39.000
and most importantly, the device handling.

01:39.000 --> 01:42.000
Over the years, there has been two common implementations,

01:42.000 --> 01:45.000
which are either a full abstraction,

01:45.000 --> 01:49.000
or a very basic abstraction, where all the software

01:49.000 --> 01:53.000
moves to do is start, stop, and tune the radio.

01:53.000 --> 01:57.000
The full abstraction has mostly been done

01:57.000 --> 02:00.000
through a library called SOPSDR,

02:00.000 --> 02:05.000
which you can see in the list pretty much everything uses,

02:05.000 --> 02:08.000
because it just makes, as yard development easy.

02:08.000 --> 02:10.000
You don't need to have all the hardware,

02:10.000 --> 02:14.000
and implement everything native you yourself.

02:14.000 --> 02:17.000
But the downside of that is that it's some hardware

02:17.000 --> 02:20.000
that can be quite challenging to implement in that way.

02:20.000 --> 02:25.000
For example, you can have SGRs like the SGR plays,

02:25.000 --> 02:27.000
which have different signal paths,

02:27.000 --> 02:29.000
which will have different gains.

02:29.000 --> 02:31.000
So if you change some setting,

02:31.000 --> 02:33.000
it can affect other setting,

02:33.000 --> 02:37.000
and that's usually very hard to represent in a full abstraction scheme.

02:37.000 --> 02:40.000
Then you have the basic abstraction with GUI,

02:40.000 --> 02:45.000
which is one of the earliest ways of doing device abstractions in SGR.

02:45.000 --> 02:48.000
And more specifically, it's the external standard,

02:48.000 --> 02:51.000
which was introduced by the WinRat software in 2006,

02:51.000 --> 02:56.000
and then continues to be used by HGSDRs in 2009.

02:56.000 --> 02:59.000
But the issue with the standard is that it's Win32 only,

02:59.000 --> 03:02.000
and by Win32, I don't just mean Windows.

03:02.000 --> 03:04.000
I actually mean 32 bit Windows.

03:04.000 --> 03:07.000
So you miss out on quite a lot of performance,

03:07.000 --> 03:09.000
which is unacceptable.

03:09.000 --> 03:12.000
And so SGR sharp, which was introduced in 2012,

03:12.000 --> 03:15.000
uses its own software-specific API for it.

03:15.000 --> 03:17.000
So does SGR in general,

03:17.000 --> 03:20.000
and obviously, so does SGR++.

03:20.000 --> 03:24.000
So obviously, when you try to implement everything yourself

03:24.000 --> 03:28.000
without the standard, you accumulate quite a lot of hardware,

03:28.000 --> 03:31.000
and that's what it takes if you want to support everything,

03:31.000 --> 03:34.000
and make sure everything is actually stable and working.

03:34.000 --> 03:39.000
So yeah, they get ready to have quite a lot of space

03:39.000 --> 03:41.000
taken up by SGR hardware.

03:41.000 --> 03:44.000
So where it's specifically in SGR++,

03:44.000 --> 03:46.000
it's through what's called source modules.

03:46.000 --> 03:49.000
They have to implement some functions.

03:49.000 --> 03:51.000
Some of the mandatory ones are obviously

03:51.000 --> 03:54.000
start, stop, and sample stream.

03:54.000 --> 03:58.000
And optionally, they can implement the tune function.

03:58.000 --> 04:01.000
An example of a module that wouldn't need a tune function

04:01.000 --> 04:05.000
is a file player, because obviously you can't tune a pre-recorded file.

04:05.000 --> 04:07.000
It can also display a menu.

04:07.000 --> 04:10.000
This is required for pretty much all of them.

04:10.000 --> 04:12.000
So technically, you don't need it.

04:12.000 --> 04:15.000
Then there's select and deselect with just allows

04:15.000 --> 04:18.000
to, for example, close device driver

04:18.000 --> 04:23.000
to avoid hoarding control of hardware for no reason.

04:23.000 --> 04:28.000
Obviously, sometimes you need to use SGR hardware remotely.

04:28.000 --> 04:32.000
For example, if you have an antenna outdoors,

04:32.000 --> 04:35.000
you can't run a 30-meter length of coax.

04:35.000 --> 04:38.000
So sometimes it's easier to just put a Raspberry PiR or something,

04:38.000 --> 04:40.000
and run the data through Ethernet.

04:40.000 --> 04:43.000
And so that's why SGR++ server was created.

04:43.000 --> 04:47.000
It allows for use source modules remotely.

04:47.000 --> 04:49.000
For that, it takes a sample stream,

04:49.000 --> 04:51.000
and does compression on it.

04:51.000 --> 04:53.000
There's actually two types of compression,

04:53.000 --> 04:55.000
whether SGR++ server does.

04:55.000 --> 04:58.000
It does both lossless compression

04:58.000 --> 05:03.000
with the ZSTD compression library.

05:03.000 --> 05:05.000
And also, cycling lossy standard,

05:05.000 --> 05:07.000
which is dynamic range compression,

05:08.000 --> 05:11.000
where it's dynamically scales the data

05:11.000 --> 05:15.000
to fit in lower bit depth samples.

05:15.000 --> 05:19.000
Obviously, since this uses GIOi,

05:19.000 --> 05:21.000
it needs a GIOi server.

05:21.000 --> 05:23.000
And as you are plus plus,

05:23.000 --> 05:26.000
it's emulates the GIOi library

05:26.000 --> 05:28.000
that's as you are plus plus uses,

05:28.000 --> 05:29.000
which is IMGIOi.

05:29.000 --> 05:33.000
And so it's manages to forward the GIOi elements.

05:33.000 --> 05:36.000
You can kind of think of it as a binary HTML,

05:36.000 --> 05:38.000
but a bit more efficient than that,

05:38.000 --> 05:42.000
so that it can display any menu remotely to the clients.

05:42.000 --> 05:44.000
And on the client site, obviously,

05:44.000 --> 05:46.000
it does the exact top of it,

05:46.000 --> 05:49.000
and the SGR++ server client is implemented

05:49.000 --> 05:53.000
just as any source module in SGR++,

05:53.000 --> 05:57.000
which is pretty easy to implement,

05:57.000 --> 06:00.000
pretty much anything with this architecture.

06:00.000 --> 06:03.000
Now let's get into more

06:03.000 --> 06:06.000
how the digital signal processing is done.

06:06.000 --> 06:10.000
The first very important objects are streams.

06:10.000 --> 06:13.000
They encapsulate two buffers,

06:13.000 --> 06:17.000
and some signaling and input output functions.

06:17.000 --> 06:20.000
The way data is moved around the software

06:20.000 --> 06:22.000
is by GIOi copy buffers,

06:22.000 --> 06:25.000
so simply writing thread rights to a buffer.

06:25.000 --> 06:26.000
And then when it's ready,

06:26.000 --> 06:30.000
it tells the stream to swap the buffers

06:30.000 --> 06:33.000
and then the reader can read the buffer.

06:33.000 --> 06:36.000
And that avoids the performance sources

06:36.000 --> 06:39.000
and countered with ring buffers,

06:39.000 --> 06:41.000
that are used in things like GIOi,

06:41.000 --> 06:43.000
and other frameworks.

06:43.000 --> 06:45.000
So here I've put kind of a function that are needed.

06:45.000 --> 06:48.000
We've got obviously read and to read samples

06:48.000 --> 06:50.000
and swap to write them.

06:50.000 --> 06:53.000
But there's also flash to signal

06:53.000 --> 06:57.000
that the reading thread is done processing the samples.

06:58.000 --> 07:02.000
And then since the processing is done multiple threads,

07:02.000 --> 07:05.000
there's the stop reader and stop writer functions,

07:05.000 --> 07:09.000
which allows to signal to processing threads

07:09.000 --> 07:12.000
because we are blocking on read or swap,

07:12.000 --> 07:14.000
that they need to stop what we're doing.

07:14.000 --> 07:20.000
Next the other important signal processing block is blocks.

07:20.000 --> 07:24.000
They encapsulate a worker thread process function

07:25.000 --> 07:27.000
and manage that specific threads.

07:27.000 --> 07:31.000
And the streams that are used by the block,

07:31.000 --> 07:33.000
then you have hierarchial blocks,

07:33.000 --> 07:36.000
which are simply multiple blocks that can be connected

07:36.000 --> 07:39.000
in any way inside of it.

07:39.000 --> 07:42.000
And then you've got a special kind of hierarchial block,

07:42.000 --> 07:44.000
which are chains,

07:44.000 --> 07:50.000
which allow to bypass any number of blocks within them.

07:50.000 --> 07:53.000
The only limitation is that all the blocks

07:53.000 --> 07:55.000
have the same input and output types.

07:55.000 --> 07:57.000
And so that's going to be used,

07:57.000 --> 08:01.000
for example, in the pre-processing section

08:01.000 --> 08:03.000
of the processing chain,

08:03.000 --> 08:07.000
where it first starts with the decimation,

08:07.000 --> 08:09.000
which is only power of two,

08:09.000 --> 08:11.000
then the optional spectrum inversion

08:11.000 --> 08:14.000
and then the IQ correction.

08:14.000 --> 08:18.000
And so instead of using a hierarchical block,

08:18.000 --> 08:22.000
this is actually currently done in a single thread,

08:22.000 --> 08:26.000
which kind of limits the maximum sample rate

08:26.000 --> 08:27.000
you can use,

08:27.000 --> 08:31.000
but does increase the efficiency,

08:31.000 --> 08:34.000
which is quite important.

08:34.000 --> 08:36.000
Next we have channelization,

08:36.000 --> 08:38.000
again, single thread.

08:38.000 --> 08:41.000
The first step in, in,

08:41.000 --> 08:44.000
sorry, channelization is frequency shifting,

08:44.000 --> 08:47.000
the raw IQ down to DC,

08:47.000 --> 08:51.000
so you shifted by the offset of your signal,

08:51.000 --> 08:53.000
then you need to resample it.

08:53.000 --> 08:54.000
This is done in two steps.

08:54.000 --> 08:56.000
We first have a power of two decimation,

08:56.000 --> 08:59.000
which is implemented quite efficiently

08:59.000 --> 09:06.000
in SGR++ using pre-planned decimation plans,

09:06.000 --> 09:11.000
which allow to have the most efficient possible combination of tabs.

09:11.000 --> 09:15.000
It's not just a series of half-band filters.

09:15.000 --> 09:17.000
It's much more advanced than that.

09:17.000 --> 09:20.000
And then to take up the rest of the resampling,

09:20.000 --> 09:23.000
there's just a standard polyphase resampler,

09:23.000 --> 09:25.000
and at the end,

09:25.000 --> 09:29.000
since the sample rate that the module expects

09:29.000 --> 09:31.000
is usually not equal to a bandwidth.

09:31.000 --> 09:35.000
There's an additional filter to filter down the signal

09:35.000 --> 09:38.000
to the bandwidth that the module desires.

09:38.000 --> 09:43.000
And this has quite high performance.

09:43.000 --> 09:45.000
It achieves an out-of-band attenuation

09:45.000 --> 09:50.000
of over 100 dBs, which is quite good compared to other software.

09:50.000 --> 09:53.000
I just noticed my microphone fell off.

09:53.000 --> 09:55.000
Sorry.

09:55.000 --> 09:58.000
Well, I guess I'll just do that.

09:58.000 --> 10:01.000
So, yeah, next.

10:01.000 --> 10:03.000
Sorry.

10:03.000 --> 10:05.000
Yeah, so next, there are the modules,

10:05.000 --> 10:10.000
and this is implemented with dynamic libraries.

10:10.000 --> 10:13.000
So this could be GLLs on Windows,

10:13.000 --> 10:17.000
or SO on Linux, die-lib on macOS.

10:17.000 --> 10:21.000
And so they simply have to implement some functions.

10:21.000 --> 10:24.000
The most important and mandatory one are

10:24.000 --> 10:26.000
create instance and delete instance.

10:26.000 --> 10:28.000
These are the functions that will create

10:28.000 --> 10:31.000
the module instance class.

10:31.000 --> 10:34.000
And it also has an info struct,

10:34.000 --> 10:36.000
which stuff like the module offer,

10:36.000 --> 10:39.000
the module version, the module name,

10:39.000 --> 10:41.000
and a lot of stuff like that,

10:41.000 --> 10:43.000
is pretty useful to display to a user.

10:43.000 --> 10:45.000
And then we have the optional init and end.

10:45.000 --> 10:47.000
This can be used, for example.

10:47.000 --> 10:49.000
Again, if you have a device driver

10:49.000 --> 10:52.000
to initialize it or terminate it.

10:52.000 --> 10:54.000
And the way this works,

10:54.000 --> 10:59.000
instead of using an API, a fixed API,

10:59.000 --> 11:03.000
the SGR++ Core is actually its own dynamic library.

11:03.000 --> 11:06.000
And so what happens is that the module can simply link to it

11:06.000 --> 11:08.000
any library and then they load it.

11:08.000 --> 11:12.000
They link themselves to the Core, which is pretty handy.

11:12.000 --> 11:15.000
Obviously this means that the API compatibility

11:15.000 --> 11:17.000
can easily be broken.

11:17.000 --> 11:21.000
So updates to the Core have to be done carefully.

11:21.000 --> 11:23.000
But it means that for example,

11:23.000 --> 11:26.000
you can write some code in VSGR++ code

11:26.000 --> 11:29.000
and then copy-paste it with no changes to a module

11:29.000 --> 11:31.000
and it will still work perfectly.

11:31.000 --> 11:32.000
And that's shown here.

11:32.000 --> 11:34.000
What the module assesses,

11:34.000 --> 11:37.000
it's simply a class with a constructor,

11:37.000 --> 11:40.000
which is given a name that the user gets to type in,

11:40.000 --> 11:42.000
a structure, obviously,

11:42.000 --> 11:45.000
a post-init function that is called when

11:45.000 --> 11:48.000
every module has been loaded,

11:48.000 --> 11:50.000
which can be useful, for example,

11:50.000 --> 11:55.000
if a module wants to load the output stream of another one,

11:55.000 --> 11:59.000
it's going to have to wait for that module to be loaded,

11:59.000 --> 12:01.000
then there's enable and disable,

12:01.000 --> 12:02.000
which I'll show in the demo,

12:02.000 --> 12:06.000
which it just signals the module that the user

12:06.000 --> 12:08.000
decides to disable the module.

12:08.000 --> 12:12.000
This has an effect that depends exactly on the module.

12:12.000 --> 12:14.000
For example, for the radio,

12:14.000 --> 12:17.000
it just deletes the VFO and stops the DSP.

12:17.000 --> 12:21.000
So in order to just save on processing power.

12:21.000 --> 12:23.000
And obviously there's an enabled load function

12:23.000 --> 12:26.000
to query the states.

12:26.000 --> 12:29.000
Next, the last part of the DSP are

12:29.000 --> 12:34.000
sinks, which take the audio that modules output

12:34.000 --> 12:37.000
and do something with it.

12:37.000 --> 12:41.000
And since there can be any number of sinks,

12:41.000 --> 12:44.000
there's something called providers,

12:44.000 --> 12:46.000
which is a silly name to just say,

12:46.000 --> 12:49.000
like factories in object oriented programming.

12:49.000 --> 12:52.000
They're just in charge of creating and deleting

12:52.000 --> 12:57.000
the instances of each sink for each module.

12:57.000 --> 13:00.000
They register themselves to the sink manager,

13:00.000 --> 13:03.000
which just manages the assets name

13:03.000 --> 13:06.000
indicate to the sinks and the audio streams.

13:06.000 --> 13:13.000
So yeah, and you create exactly one stream,

13:13.000 --> 13:16.000
one sinks per audio stream.

13:16.000 --> 13:20.000
It has been requested to actually have multiple sinks per stream,

13:20.000 --> 13:21.000
which can be useful.

13:21.000 --> 13:25.000
For example, if you want to listen to audio

13:25.000 --> 13:28.000
from a digital signal, because you want to check

13:28.000 --> 13:31.000
what the quality is like, but you also want to send it

13:31.000 --> 13:33.000
to an external decoder.

13:33.000 --> 13:35.000
It can be useful to have two sinks.

13:35.000 --> 13:36.000
And that's not true.

13:36.000 --> 13:40.000
It's impossible with this scheme, but it will be in the future.

13:40.000 --> 13:45.000
And the sink instances themselves are abstracted very similarly

13:45.000 --> 13:48.000
to how sources are done.

13:48.000 --> 13:51.000
It's also just mandatory functions, which

13:51.000 --> 13:53.000
starts up and the sample stream.

13:53.000 --> 13:56.000
And then, optionally, the sink can display your menu.

13:56.000 --> 13:58.000
I say optionally, because, for example,

13:58.000 --> 14:01.000
we enjoyed the sink on Android.

14:01.000 --> 14:03.000
It doesn't actually have any setting,

14:03.000 --> 14:06.000
because it's quite annoying to query what

14:06.000 --> 14:09.000
sample rate you can use and what device you can output.

14:09.000 --> 14:11.000
So at the moment, it literally doesn't

14:11.000 --> 14:13.000
implement the menu function.

14:13.000 --> 14:16.000
All right, so now let's do a demo.

14:16.000 --> 14:18.000
And hopefully, it doesn't crash.

14:18.000 --> 14:26.000
All right.

14:26.000 --> 14:29.000
So this is VCR++ software.

14:29.000 --> 14:33.000
It's a version that's a few months old, actually.

14:33.000 --> 14:35.000
But it's just what I run on this PC.

14:35.000 --> 14:38.000
And nothing really new has been added.

14:38.000 --> 14:41.000
Here you can see your SGR device, which is

14:41.000 --> 14:43.000
represented in source menu.

14:43.000 --> 14:46.000
You can choose which device type you want.

14:46.000 --> 14:49.000
Here, obviously, I have selected RGLs.

14:49.000 --> 14:52.000
Because that's what's on my PC.

14:52.000 --> 14:54.000
That's very pretty much anything you've ever

14:54.000 --> 14:56.000
want, air spy, radar, attack, RF.

14:56.000 --> 14:58.000
Probably heard of all these.

14:58.000 --> 15:01.000
Some lesser known one, like for Perseus, which is

15:01.000 --> 15:02.000
kind of old.

15:02.000 --> 15:05.000
But the important thing to see is that you've got

15:05.000 --> 15:08.000
all you're setting that are tailored exactly

15:08.000 --> 15:09.000
to the device.

15:09.000 --> 15:11.000
You don't have some weird abstractions where

15:12.000 --> 15:17.000
sometimes you'll have multiple signal paths

15:17.000 --> 15:20.000
inside the SGR that are represented by antenna

15:20.000 --> 15:21.000
ports, which doesn't make sense.

15:21.000 --> 15:23.000
I don't have an SGR that's in.

15:23.000 --> 15:25.000
Demonstrate that here.

15:25.000 --> 15:28.000
But yeah, and you can see that the module just

15:28.000 --> 15:30.000
implements its GUI here.

15:30.000 --> 15:32.000
It goes down to here.

15:32.000 --> 15:35.000
And after that, that's the same for every module.

15:35.000 --> 15:38.000
So if I was to select something like air spy,

15:38.000 --> 15:40.000
you'll see you'll still have the IQ

15:40.000 --> 15:43.000
correction and inverse IQ and all the stuff.

15:43.000 --> 15:45.000
So that's what source.

15:45.000 --> 15:47.000
And so I'll select my RGLs.

15:47.000 --> 15:52.000
And now I can start it and go to somewhere where

15:52.000 --> 15:55.000
we're sure to see some stuff.

15:55.000 --> 15:58.000
And obviously, we don't see anything.

15:58.000 --> 16:01.000
Because, not very good.

16:01.000 --> 16:05.000
Okay, here's lonely FM signal.

16:06.000 --> 16:10.000
And so I can just pick white band of FM selected

16:10.000 --> 16:12.000
and receive the signal.

16:12.000 --> 16:14.000
And obviously, it's a copy.

16:14.000 --> 16:19.000
So let me just, all right.

16:19.000 --> 16:22.000
So yeah, now we're receiving the FM signal.

16:22.000 --> 16:25.000
And so we can go down to a radio module.

16:25.000 --> 16:27.000
And as I said, it's a module.

16:27.000 --> 16:29.000
It's not actually implemented in records.

16:29.000 --> 16:31.000
It's own kind of plugin.

16:31.000 --> 16:36.000
And it's modeled after the same layout

16:36.000 --> 16:38.000
as your sharps.

16:38.000 --> 16:40.000
So you have your mode selector here.

16:40.000 --> 16:43.000
The band width, which you can adjust either by

16:43.000 --> 16:45.000
drag and dropping like this.

16:45.000 --> 16:48.000
Or just typing in directly.

16:48.000 --> 16:51.000
Then you've got the emphasis, which for your option

16:51.000 --> 16:53.000
be set to 50, but it doesn't matter.

16:53.000 --> 16:55.000
Vend some other options.

16:55.000 --> 16:57.000
I can be going or disabling stereo,

16:57.000 --> 17:00.000
which for broadcast FM obviously you will even on.

17:00.000 --> 17:03.000
That's a lot of interesting stuff.

17:03.000 --> 17:05.000
But not really the subject of the stock.

17:05.000 --> 17:08.000
Then you have another module, which is where we

17:08.000 --> 17:11.000
quarter, and this is what makes use of binding directly

17:11.000 --> 17:12.000
to the IQ stream.

17:12.000 --> 17:15.000
Or binding to the output of a module.

17:15.000 --> 17:17.000
So here we have the radio module.

17:17.000 --> 17:20.000
And you can actually select its audio stream here.

17:20.000 --> 17:24.000
And that's what will be recorded if I press record here.

17:24.000 --> 17:27.000
It's just going to record the audio from the station.

17:27.000 --> 17:31.000
Or I can put it in base band mode, and where it will just

17:31.000 --> 17:34.000
record the raw IQ from the SDR.

17:34.000 --> 17:36.000
And yeah, that's cool.

17:36.000 --> 17:37.000
It works.

17:37.000 --> 17:40.000
So next, that's another module.

17:40.000 --> 17:43.000
You can have some that don't actually use any DSP.

17:43.000 --> 17:46.000
And that's the case of a frequency manager,

17:46.000 --> 17:50.000
which is just a useful module to display some bookmarks here.

17:50.000 --> 17:54.000
So here I have the ones for the radio station back in the

17:54.000 --> 17:55.000
station.

17:55.000 --> 17:57.000
So obviously we're not receiving them here.

17:57.000 --> 18:00.000
But if I were in the edge, we'd see a signal there.

18:00.000 --> 18:01.000
And I can just click on it.

18:01.000 --> 18:05.000
And it's automatically sets of parameters for it.

18:05.000 --> 18:09.000
And here you can add some, for example, if I were here.

18:09.000 --> 18:12.000
I can just click add, name it, set of parameters.

18:12.000 --> 18:13.000
I want some stuff like that.

18:13.000 --> 18:15.000
And that just doesn't use any DSP.

18:15.000 --> 18:18.000
It's just a utility module that creates menu.

18:18.000 --> 18:19.000
And that's about it.

18:19.000 --> 18:25.000
Then just some miscellaneous settings.

18:25.000 --> 18:28.000
And yeah, and now we arrived at the sync menu, which was what I was

18:28.000 --> 18:31.000
talking about, at the end.

18:31.000 --> 18:34.000
So here we have a radio that is currently

18:34.000 --> 18:36.000
demodulating some FM.

18:36.000 --> 18:41.000
And you can see that I can select multiple types of things.

18:41.000 --> 18:43.000
We have non-vatches just a null sync.

18:43.000 --> 18:45.000
It doesn't go anywhere.

18:45.000 --> 18:46.000
It's not really useful.

18:46.000 --> 18:48.000
But if you don't want to have audio from something,

18:48.000 --> 18:52.000
then you've got audio, which is just your sound card.

18:52.000 --> 18:59.000
Next, you have network, which just allows you to output the audio samples

18:59.000 --> 19:01.000
to a network socket.

19:01.000 --> 19:03.000
You can do it with your UDP or TCP.

19:03.000 --> 19:06.000
And set the sample rate you wanted that.

19:06.000 --> 19:07.000
And that's about it.

19:07.000 --> 19:10.000
You just got the new audio stuff, just something I'm working on,

19:10.000 --> 19:13.000
which isn't really important right now.

19:13.000 --> 19:17.000
Obviously, theme, I put it on dark to not burn your readiness.

19:17.000 --> 19:21.000
But if somehow you enjoy it, you can also set it to that.

19:21.000 --> 19:26.000
But I will judge you.

19:26.000 --> 19:30.000
So yeah, and now the module manager, which is kind of the main feature

19:30.000 --> 19:36.000
of SDR++, is let's say I want just to decode something else.

19:36.000 --> 19:42.000
Let's say my antenna was better, and I was actually receiving more than a single station,

19:42.000 --> 19:44.000
which I mean, okay, yeah.

19:44.000 --> 19:46.000
I was sure it should be a few more.

19:46.000 --> 19:49.000
So let's try to just add another radio.

19:49.000 --> 19:53.000
We can just select radio here at the bottom and type in the name.

19:53.000 --> 19:57.000
I'm just going to say radio 2.

19:57.000 --> 20:01.000
Click plus, and now we can see a new VFO has appeared.

20:01.000 --> 20:05.000
And so I can just stick it on that signal and go grab the menu,

20:05.000 --> 20:09.000
which by the way, if you've used SDR++ before,

20:09.000 --> 20:13.000
but you don't know about it, you can just drag and drop menus like this.

20:14.000 --> 20:19.000
I'm not going to bother bringing up to the top because I'm a trackpad and it's a bit annoying.

20:19.000 --> 20:26.000
But yeah, you've got a completely separate FMD modulator here that works on this station.

20:26.000 --> 20:29.000
And you can then route the audio differently.

20:29.000 --> 20:33.000
So here I would have this one on the network, this one I could send to audio.

20:33.000 --> 20:37.000
It's we just up to you what you want to do with it.

20:37.000 --> 20:44.000
And now let's say I don't want it anymore, I can just click minus and it goes away.

20:44.000 --> 20:50.000
Now let's talk about the enable and disable thing I was talking about in the module section.

20:50.000 --> 20:56.000
You'll notice that unlike other menus, the radio just shows a checkbox here.

20:56.000 --> 21:02.000
And what's that useful for is if you click it, there's no more VFO, the DSP is completely stopped.

21:02.000 --> 21:09.000
And that just allows you to disable the module without deleting its completely, which can be annoying,

21:09.000 --> 21:12.000
because you just have to recreate it the next time you want to use it.

21:12.000 --> 21:17.000
Here you just click the checkbox and you've got your module again.

21:17.000 --> 21:24.000
I really often use it just for example, if I use VM70 module, which is a feature of SDR++.

21:24.000 --> 21:29.000
If I have it installed on this one, yes, I do.

21:29.000 --> 21:45.000
And if I had edit, now magically I just have a new demodulator right here, which I can set hopefully someone can say something on M17.

21:45.000 --> 21:49.000
Here we go.

21:49.000 --> 21:55.000
That's the frequency that the amateur radio booth uses for the M17 simplex.

21:55.000 --> 22:04.000
And so I can go down here and look at the M17 menu, which just, I don't know if anyone has a M17 radio here.

22:04.000 --> 22:05.000
Okay.

22:05.000 --> 22:06.000
Yeah.

22:06.000 --> 22:10.000
Well, yes, if anyone has an M17 radio, they can try saying something.

22:10.000 --> 22:15.000
I'll just drop again because it's going to, it's going to just die.

22:15.000 --> 22:24.000
So if you just say something and, well, I'll just grab mine if I can find it.

22:24.000 --> 22:30.000
All right, I've got mine.

22:30.000 --> 22:35.000
Or you can just, yeah.

22:35.000 --> 22:40.000
So I'm just going to transmit forward for the free.

22:40.000 --> 22:42.000
Just go to type of frequency.

22:42.000 --> 22:45.000
Okay.

22:45.000 --> 22:46.000
Put it to one watts.

22:46.000 --> 22:49.000
And so, yeah, that's what I thought.

22:49.000 --> 23:00.000
I'm going to remove the antenna because it's going to overload instantly at such a short range.

23:00.000 --> 23:01.000
All right.

23:01.000 --> 23:06.000
And so now if I transmit here, and I'm on SM, that's it.

23:06.000 --> 23:10.000
Okay.

23:10.000 --> 23:15.000
All right, just got to fix the frequency because this radio is a tiny bit broken.

23:15.000 --> 23:16.000
Okay.

23:16.000 --> 23:19.000
And here we're receiving actually my M17 signal.

23:19.000 --> 23:26.000
And so you can see it shows my, my call sign, the broadcast tab, the data type and everything.

23:26.000 --> 23:33.000
And that's used quite a lot by the M17 team to actually test radios and make sure of your

23:33.000 --> 23:35.000
compliance.

23:35.000 --> 23:40.000
And so, yeah, you can, if you're done using it, just click the checkbox and it's gone.

23:40.000 --> 23:44.000
You don't have to think about it and you can just reenable it the next time.

23:44.000 --> 23:48.000
And so, yeah, I think that was a tour of Asia++.

23:48.000 --> 23:54.000
I would have lots to show the server features, but the Wi-Fi here is completely overloaded.

23:54.000 --> 24:01.000
So, I literally can't even load emails, so it's not going to do IQ over internet.

24:01.000 --> 24:07.000
So, yeah, I think, I think this part of the demo is done.

24:07.000 --> 24:10.000
Let's go back to the slide.

24:10.000 --> 24:18.000
All right, so a future.

24:18.000 --> 24:24.000
So, the first thing I want to talk about is things that won't change, because there are things

24:24.000 --> 24:29.000
that from feedback I've heard were done right, which was the layout, which again was just stolen from

24:29.000 --> 24:30.000
SDR sharps.

24:30.000 --> 24:32.000
So, it makes sense, but it was decent.

24:32.000 --> 24:38.000
General workflow of how things work with software, the OS support and the hardware support.

24:38.000 --> 24:42.000
The hardware support, especially, is nice, because you used to be locked into

24:42.000 --> 24:46.000
ecosystems with SDR sharps, which only allowed its own SDRs.

24:46.000 --> 24:51.000
And then cut off support for others, which wasn't really nice.

24:51.000 --> 24:53.000
And I don't think that's cool.

24:53.000 --> 24:58.000
So, I'll always support any hardware that manufactures one supported, or they want to

24:58.000 --> 25:03.000
add support themselves, they can do it to its no difference.

25:03.000 --> 25:05.000
That's what will change.

25:05.000 --> 25:13.000
First, the GUI, which is done with the library called DRAM GUI, will be replaced with a custom GUI library.

25:13.000 --> 25:20.000
Obviously, people would say, well, why not use QT, why not use WX, why not use insert name here?

25:20.000 --> 25:25.000
Well, because they're all trying to be frameworks and not library.

25:25.000 --> 25:32.000
And so, you end up having to write hundreds of lines of boilerplate for any silly little thing.

25:32.000 --> 25:33.000
And I don't like that.

25:33.000 --> 25:38.000
And so, I decided to write my own custom GUI library, which is, it's not done yet.

25:38.000 --> 25:43.000
It's going to take a bit longer, but I hope to introduce its soon.

25:43.000 --> 25:50.000
Next, as you're a++, we'll move from being single input multiple output to multiple input multiple outputs.

25:50.000 --> 25:57.000
And what I mean by that is, it will both be able to use SDRs with multiple channels, like the blade or F,

25:57.000 --> 26:05.000
that was shown by Sebastian and the previous talk, or use multiple SDRs at once,

26:05.000 --> 26:09.000
and then move the Fos between them seamlessly.

26:09.000 --> 26:17.000
I'll also go from being received only to being received and transmit.

26:17.000 --> 26:21.000
Transly we aren't really good open source options for transmit.

26:21.000 --> 26:28.000
They either don't have great hardware supports, or are really unstable, as your angel.

26:28.000 --> 26:30.000
Sorry.

26:30.000 --> 26:36.000
I had to use it for Q100, and yeah, it's really motivated me to implement transmit and try to do it.

26:36.000 --> 26:40.000
In a way that's user-friendly and pretty stable.

26:40.000 --> 26:46.000
And also, the DSP library is going to be completely rewritten, because as I said at the beginning,

26:46.000 --> 26:52.000
I just did it during COVID for fun, and the structure didn't end up being really optimal.

26:52.000 --> 26:59.000
But now with four years of trial and error, I think it can be rewritten in a way that's a lot more efficient.

26:59.000 --> 27:06.000
And so yeah, we'll use the lessons learned from 1.0 to do SDR++ 2.0.

27:06.000 --> 27:11.000
Before ending this talk, I have to think of a Patreon supporter of the project.

27:11.000 --> 27:17.000
There are a lot more than that, but those are the ones that accepted to be in the credits.

27:17.000 --> 27:26.000
Obviously, they've been paying for some of the hardware that was needed for my food and university tuition events,

27:26.000 --> 27:30.000
so thanks a lot to them, and thanks for your attention.

27:30.000 --> 27:44.000
All right, so any questions now?

27:44.000 --> 27:45.000
Yes?

27:45.000 --> 27:51.000
Many of you already support this, or don't know if you can do this in filing, because you intend to support it,

27:51.000 --> 27:52.000
so you can see that.

27:52.000 --> 27:59.000
Okay, so the question is, do I intend to support SIGMF for FIWANT put?

27:59.000 --> 28:05.000
So I'm not sure if I'm going to support it first party, because I don't really know the format right now,

28:05.000 --> 28:13.000
and the priority is make the file player a bit better, because right now it's really happy, it hasn't changed since 2021.

28:13.000 --> 28:19.000
So the priority is first to rewrite the file player, and then maybe more formats can be added.

28:19.000 --> 28:28.000
But again, since SDR++ is modular in such a way that there's no difference between user plugins and official plugins.

28:28.000 --> 28:34.000
So anyone could write SIGMF source, and it would just show up like any other.

28:34.000 --> 28:37.000
All right, I have a question.

28:37.000 --> 28:38.000
Yes?

28:38.000 --> 28:41.000
Can you get my laptop support?

28:41.000 --> 28:44.000
Oh, so the question is, can we have macOS support?

28:44.000 --> 28:49.000
It's already supported, both on M1 and X86.

28:49.000 --> 28:55.000
Okay, I have a question, yes?

28:55.000 --> 29:00.000
Sorry, I can't.

29:00.000 --> 29:06.000
Okay, so if I have to send a question, is can SGR++ be added to home brew?

29:06.000 --> 29:11.000
Well, if someone wants to do it, sure, but I don't have a mac.

29:11.000 --> 29:14.000
All the development to support macOS was done blind.

29:14.000 --> 29:17.000
Like just trying and seeing if it builds in the C.I.

29:17.000 --> 29:22.000
And when asking people to try it out, so maybe if I get a mac,

29:23.000 --> 29:25.000
I'll be able to add support for it.

29:25.000 --> 29:29.000
But I think someone has already added it to mac ports.

29:29.000 --> 29:34.000
I think I'm not sure, but yeah, if I do get a mac at some point, I will add it.

29:34.000 --> 29:35.000
Yes?

29:35.000 --> 29:37.000
Okay, yes?

29:37.000 --> 29:51.000
Okay, so the question is why does the 90 builds

29:51.000 --> 29:54.000
says November 2022?

29:54.000 --> 29:58.000
So it's just because I'm misusing GitHub.

29:58.000 --> 30:02.000
It's not really meant to have a continuously updating release.

30:02.000 --> 30:09.000
And so it still says the date where I started doing 90 builds instead of scheduled releases.

30:09.000 --> 30:14.000
So that's not really something I can fix, but.

30:15.000 --> 30:17.000
Yes, it's really, it's 90.

30:17.000 --> 30:21.000
If you look at the date on the files, you'll see it's, it's really just one.

30:21.000 --> 30:22.000
Yeah.

30:22.000 --> 30:23.000
Okay.

30:23.000 --> 30:24.000
Other questions?

30:24.000 --> 30:25.000
Yes?

30:25.000 --> 30:27.000
I actually didn't know about the output one.

30:27.000 --> 30:29.000
So there's been some sort of discussion.

30:29.000 --> 30:32.000
What do you mean if you had any questions?

30:32.000 --> 30:37.000
I'd like to ask you a question.

30:37.000 --> 30:43.000
Okay, so the question is where any plan to add the last-less compression to recordings?

30:43.000 --> 30:44.000
Yes.

30:44.000 --> 30:54.000
We're working with another developer that also needs recording to maybe publish a new compressed format.

30:54.000 --> 30:57.000
I did try flack.

30:57.000 --> 30:59.000
I assume that's what you want.

30:59.000 --> 31:07.000
Flack does work, but for IQ, it's not really, it's a bit slow to record IQ.

31:07.000 --> 31:12.000
Like if you try to record something like a blade RF at 61 mega samples per second,

31:12.000 --> 31:14.000
it's not going to be able to handle it.

31:14.000 --> 31:16.000
So yeah, but it's definitely planned.

31:16.000 --> 31:18.000
It's super useful for archival.

31:18.000 --> 31:25.000
And combined with dynamic range compression, it can really help a lot to save signals and stuff.

31:25.000 --> 31:26.000
Yeah.

31:26.000 --> 31:27.000
Okay.

31:27.000 --> 31:30.000
Other questions?

31:30.000 --> 31:31.000
Yes?

31:31.000 --> 31:38.000
If I send your vector or unit and I just hope it goes as an excuse for you in the video.

31:38.000 --> 31:43.000
So let me try to understand your question.

31:43.000 --> 31:46.000
Send what for GDP.

31:46.000 --> 31:49.000
You mean through the network sync?

31:49.000 --> 31:50.000
Yeah.

31:50.000 --> 31:52.000
So yeah, you can just send them straight.

31:52.000 --> 31:54.000
So I'm going to repeat the question actually since it's recorded.

31:54.000 --> 31:59.000
So the question was, can the network sync be used to output to GNU radio?

31:59.000 --> 32:01.000
Yes, absolutely.

32:01.000 --> 32:02.000
But it depends what you want to do.

32:02.000 --> 32:06.000
If you want to send audio to GNU radio, yes, just use the network sync.

32:06.000 --> 32:10.000
But there's actually a better way to do it.

32:10.000 --> 32:14.000
I don't know if I have it installed in this one.

32:14.000 --> 32:19.000
It's the IQ-Exporter module, which, okay, I have right here.

32:19.000 --> 32:32.000
And if you add it, right here, it will give you a menu where you can choose to either export the full base band from VSDR.

32:32.000 --> 32:37.000
Or you can output a VFO and now it spawns a VFO, which you can drag around.

32:37.000 --> 32:41.000
And sorry, wrong menu.

32:41.000 --> 32:44.000
This one, you can set which sample rate you want.

32:44.000 --> 32:47.000
You can set if it's TCP server.

32:47.000 --> 32:49.000
It's pcln to dp.

32:49.000 --> 32:51.000
The size, the sample type and everything.

32:51.000 --> 32:54.000
And this will substrate to GNU radio.

32:54.000 --> 32:55.000
Okay.

32:55.000 --> 32:57.000
Two people.

32:57.000 --> 32:58.000
I guess.

32:58.000 --> 32:59.000
Yes?

32:59.000 --> 33:00.000
Yes.

33:00.000 --> 33:01.000
Yes.

33:01.000 --> 33:02.000
Yes.

33:02.000 --> 33:15.000
So question is, will it also support to re-consume to IQ data, so if I record a data, can I read the whole chat?

33:15.000 --> 33:16.000
Yes.

33:16.000 --> 33:18.000
So the question is will transmit support?

33:18.000 --> 33:20.000
So what's re-transmitting IQ?

33:20.000 --> 33:21.000
Yes.

33:21.000 --> 33:28.000
It will just allow you to send IQ to VSDR or send, have a transmit VFO to send some stuff.

33:28.000 --> 33:31.000
Modules can do pretty much what they want.

33:31.000 --> 33:35.000
You have to think of VSDR plus plus more as a framework than software.

33:35.000 --> 33:39.000
And it has to let modules do whatever they want with hardware.

33:39.000 --> 33:40.000
Yes.

33:40.000 --> 33:41.000
So yes.

33:41.000 --> 33:42.000
It will work.

33:42.000 --> 33:43.000
Yes.

33:43.000 --> 33:44.000
And I think.

33:44.000 --> 33:51.000
The question to this feature of sending IQ can be sent to multiple.

33:51.000 --> 33:55.000
With UDP, you can use UDP broadcast.

33:55.000 --> 33:56.000
Yes.

33:56.000 --> 33:57.000
No.

33:57.000 --> 34:00.000
I mean, to intents, essentially, multiple IQ reports.

34:00.000 --> 34:01.000
Oh, yes.

34:01.000 --> 34:02.000
Yeah.

34:02.000 --> 34:03.000
It's.

34:03.000 --> 34:04.000
Yeah.

34:04.000 --> 34:07.000
Like if I just say.

34:07.000 --> 34:09.000
So I assume that's what you mean.

34:09.000 --> 34:10.000
Yeah.

34:10.000 --> 34:12.000
I can just add the second IQ exporter.

34:12.000 --> 34:19.000
And if it works, I don't know why I don't see.

34:19.000 --> 34:20.000
Oh, wait.

34:20.000 --> 34:22.000
It's in based bandia.

34:22.000 --> 34:24.000
You can just add as many as you want.

34:24.000 --> 34:26.000
And it will just export all your signals.

34:26.000 --> 34:27.000
Yeah.

34:27.000 --> 34:28.000
Yes.

34:28.000 --> 34:36.000
Can you ingest or plug this in?

34:36.000 --> 34:40.000
So can you ingest IQ streams on the network?

34:40.000 --> 34:41.000
You mean?

34:41.000 --> 34:42.000
Do you want to plug this?

34:42.000 --> 34:43.000
Oh, no.

34:43.000 --> 34:44.000
No.

34:44.000 --> 34:45.000
No.

34:45.000 --> 34:46.000
No.

34:46.000 --> 34:47.000
No.

34:47.000 --> 34:48.000
No.

34:48.000 --> 34:49.000
No.

34:50.000 --> 34:53.000
It's only outputs raw samples and input raw samples.

34:53.000 --> 34:56.000
But I think, I don't know.

34:56.000 --> 35:01.000
If you want to import samples, we have a network.

35:01.000 --> 35:04.000
I think I have it on this one.

35:04.000 --> 35:05.000
No.

35:05.000 --> 35:06.000
I don't have it.

35:06.000 --> 35:07.000
Let me check.

35:07.000 --> 35:09.000
It must be here.

35:09.000 --> 35:10.000
Yeah.

35:10.000 --> 35:14.000
Networks source.

35:14.000 --> 35:15.000
No.

35:15.000 --> 35:17.000
That's kind of an example of adding a source.

35:17.000 --> 35:19.000
It's just add the module.

35:19.000 --> 35:22.000
And now magically, you just have a network source.

35:22.000 --> 35:24.000
So yeah, you can take samples.

35:24.000 --> 35:29.000
But it's only ints and flows raw things.

35:29.000 --> 35:30.000
Yes.

35:30.000 --> 35:35.000
You can use FFMPEG or any other command line, too.

35:35.000 --> 35:36.000
Okay.

35:36.000 --> 35:37.000
Other questions?

35:37.000 --> 35:38.000
Yes.

35:38.000 --> 35:41.000
The one thing you can see just the problem.

35:41.000 --> 35:46.000
By default, it's five milliseconds.

35:46.000 --> 35:51.000
It can be, basically, it depends on the size of a buffer that you send for the DSP chain.

35:51.000 --> 35:54.000
The DSP chain is pretty much instance.

35:54.000 --> 35:59.000
But if you buffer up five milliseconds, that's going to be your latency.

35:59.000 --> 36:01.000
It's pretty much, you can't hear.

36:01.000 --> 36:07.000
It's like, I've had multiple times the audio just from the radio talking into it.

36:07.000 --> 36:09.000
And listening, it's really not much.

36:09.000 --> 36:13.000
It's, of course, it's going to be worse than the hardware radio,

36:13.000 --> 36:15.000
but it's not anything crazy.

36:16.000 --> 36:17.000
Yes?

36:23.000 --> 36:25.000
Can you repeat?

36:25.000 --> 36:27.000
No, it's reduction.

36:27.000 --> 36:29.000
Yes, I plan to implement it.

36:29.000 --> 36:35.000
I just have to get it to work, because I don't want to just use a pre-made library.

36:35.000 --> 36:38.000
Everything, as we are plus plus, is written from scratch.

36:38.000 --> 36:40.000
And I want to continue that.

36:40.000 --> 36:43.000
It's a bit, so if you don't want to wait for me to do it,

36:43.000 --> 36:47.000
there are multiple people who have written modules that have noise reduction.

36:47.000 --> 36:49.000
But yes, it will be supported.

36:49.000 --> 36:53.000
Not AI, just deterministic noise reduction is.

36:53.000 --> 36:57.000
Someone has already made one.

36:57.000 --> 36:59.000
I will prompt.

37:01.000 --> 37:06.000
I will write one, but I mean, including natively, it makes no difference.

37:06.000 --> 37:10.000
If it wasn't included, the only difference is you don't need to download it.

37:10.000 --> 37:13.000
You don't need to download it.

37:13.000 --> 37:18.000
On MacOS, no, no, you should just be able to add it to you open up the bundle.

37:18.000 --> 37:23.000
Probably need to talk to the module after they might not have planned for MacOS.

37:23.000 --> 37:24.000
Okay.

37:24.000 --> 37:25.000
Yes?

37:25.000 --> 37:27.000
Yes, write it.

37:27.000 --> 37:38.000
You can just, it's power of two, but it's not, as I said, it's not just a dumb,

37:38.000 --> 37:40.000
but you have been filter.

37:40.000 --> 37:45.000
It's actually a special plan for each decimation.

37:45.000 --> 37:46.000
Yes?

37:46.000 --> 37:47.000
Okay.

37:47.000 --> 37:48.000
I have a questions.

37:48.000 --> 37:51.000
We have just four minutes left.

37:51.000 --> 37:52.000
Yes?

37:52.000 --> 37:56.000
Do you plan to have a sub-order button that wasn't helpful?

37:56.000 --> 37:58.000
I mean, what people can do?

37:58.000 --> 38:02.000
I'll only do this regular flight now.

38:02.000 --> 38:04.000
You can talk about it.

38:04.000 --> 38:05.000
Okay.

38:05.000 --> 38:13.000
So the question is, do I plan to have an official repository of modules?

38:13.000 --> 38:15.000
I've been thinking about it.

38:15.000 --> 38:20.000
The issue is vetting for security, because modules are dynamic libraries.

38:20.000 --> 38:21.000
They're not just scripts.

38:21.000 --> 38:24.000
They run raw executable code.

38:24.000 --> 38:27.000
So you have to be careful about what you install.

38:27.000 --> 38:33.000
And I'm not sure at this time I want to be responsible for the security of thousands of computers.

38:33.000 --> 38:35.000
So yeah, I will consider it.

38:35.000 --> 38:36.000
That will see.

38:36.000 --> 38:39.000
Okay.

38:39.000 --> 38:40.000
Another question?

38:40.000 --> 38:42.000
Or, yes?

38:42.000 --> 38:47.000
You say you're going to develop a new graphical interface?

38:47.000 --> 38:48.000
Yes.

38:48.000 --> 38:58.000
And are you going to make it something kind of more friendly like the icons or buttons?

38:58.000 --> 39:02.000
So not only the menu text menu.

39:02.000 --> 39:03.000
Okay.

39:03.000 --> 39:08.000
So the question is, I'm going to do a new GUI system.

39:08.000 --> 39:10.000
Not really.

39:10.000 --> 39:14.000
It's just going to be a new GUI library.

39:14.000 --> 39:17.000
But the menus you see here, nothing will change.

39:17.000 --> 39:21.000
It's just going to be a new library with the same layout.

39:21.000 --> 39:24.000
Because it's just a brand new people like it.

39:24.000 --> 39:27.000
It's copy, as I said, from SDR sharp.

39:27.000 --> 39:28.000
It's pretty intuitive.

39:28.000 --> 39:32.000
So I don't think there's much reason changing it.

39:32.000 --> 39:35.000
So yeah, it's just purely back and stuff.

39:35.000 --> 39:38.000
Users just see if we'll look a bit different, but that's about it.

39:38.000 --> 39:40.000
Okay.

39:40.000 --> 39:42.000
So yes?

39:42.000 --> 39:44.000
Can you go with the module?

39:44.000 --> 39:45.000
What do you do?

39:45.000 --> 39:48.000
What do you do?

39:48.000 --> 39:49.000
Okay.

39:49.000 --> 39:51.000
So I don't want to bore with the map.

39:51.000 --> 39:55.000
But basically, when you do decimation,

39:55.000 --> 39:59.000
it's not efficient to do it in a single stage, generally.

39:59.000 --> 40:03.000
So usually do it in multiple stages.

40:03.000 --> 40:09.000
The industry standard for a while has just been to combine half-band decimation.

40:09.000 --> 40:11.000
And just add as many as you want.

40:11.000 --> 40:17.000
But if you do the map, you can actually compute the filters

40:17.000 --> 40:23.000
for each decimation stage in such a way that you allow

40:23.000 --> 40:29.000
some signal to leak through from higher Nyquist zones into lower ones.

40:29.000 --> 40:33.000
If you know that they are going to be removed by lower stages,

40:33.000 --> 40:35.000
running at lower sample rates.

40:35.000 --> 40:39.000
And so from that, you can run an optimization algorithm,

40:39.000 --> 40:44.000
which given a yes-free ratio for SDR++, it's 95%.

40:44.000 --> 40:49.000
So that means that you're guaranteed that in the 95% of a bandwidth.

40:49.000 --> 40:57.000
You won't have any ALS over 100, well, under 100 dB, I should say.

40:57.000 --> 41:01.000
And yeah, it's numerically optimized.

41:01.000 --> 41:05.000
And if you look at the source code, you can see the plans and how they're built.

41:05.000 --> 41:10.000
I haven't published the source code of the tool that generates them

41:10.000 --> 41:14.000
because it was a collaboration with AirSpy.

41:14.000 --> 41:17.000
And they're planning to re-sacentific paper about how it works.

41:17.000 --> 41:22.000
So I don't want to be an asshole and publish very stuff before they do.

41:22.000 --> 41:26.000
But you'll probably hear about it in the future, yes.

41:26.000 --> 41:30.000
And I think someone else had a question?

41:30.000 --> 41:31.000
Yes?

41:31.000 --> 41:38.000
You can't do it to you next time.

41:38.000 --> 41:43.000
No, but I guess you can just use netcats.

41:43.000 --> 41:45.000
I guess that could be a feature.

41:45.000 --> 41:48.000
But I try to have the modules be cross-platform.

41:48.000 --> 41:53.000
And you next time obviously would be only on macOS and unix.

41:53.000 --> 41:56.000
I guess it's possible, but we'll see.

41:56.000 --> 41:58.000
Open the feature request.

41:59.000 --> 42:01.000
And I think we're out of time.

42:01.000 --> 42:02.000
Yes.

42:02.000 --> 42:03.000
We are out of time.

42:03.000 --> 42:04.000
Unfortunately.

42:04.000 --> 42:05.000
I guess.

42:05.000 --> 42:07.000
Thank you very much.

42:07.000 --> 42:19.000
If you have any other questions, just send me an email or go on the Discord server for the

42:19.000 --> 42:20.000
Atlas Plus.

42:20.000 --> 42:21.000
Yeah.

42:21.000 --> 42:22.000
Thank you.

