Ejemplo n.º 1
0
        public AudioResource(SpectrumVideoDemodConfig config, CanvasContext ctx)
        {
            //Set
            this.label = config.label;

            //Get demodulator
            switch (config.demodType)
            {
            case "WBFM": demodulator = new WbFmDemodulator(); break;

            default: throw new Exception("Unknown demodulator type.");
            }

            //Make buffers
            bufferSize            = ctx.BufferSize;
            generalBuffer         = UnsafeBuffer.Create(ctx.BufferSize, out generalBufferComplexPtr);
            generalBufferFloatPtr = (float *)generalBufferComplexPtr;
            audioABuffer          = UnsafeBuffer.Create(ctx.BufferSize, out audioABufferPtr);
            audioBBuffer          = UnsafeBuffer.Create(ctx.BufferSize, out audioBBufferPtr);

            //Init audio
            demodDecimator = ComplexDecimator.CalculateDecimator(ctx.DecimatedSampleRate, config.demodBandwidth, 20, config.demodBandwidth * 0.05f, out float demodSampleRate);
            float actualAudioRate = demodulator.Configure(ctx.BufferSize, demodSampleRate, config.outputSampleRate);

            audioResampler = new ArbitraryStereoResampler(actualAudioRate, config.outputSampleRate, ctx.BufferSize);

            //Create output
            output = ctx.OutputProvider.GetAudioOutput(config.outputFilename, config.outputSampleRate, bufferSize);
        }
        public SpectrumVideoCanvas(SpectrumVideoSource source, SpectrumVideoCanvasConfig config, IOutputProvider outputProvider)
        {
            //Set
            width               = config.video_output.width;
            label               = config.label;
            decimation          = config.baseband.decimation;
            frameRate           = config.video_output.frameRate;
            this.outputProvider = outputProvider;
            this.source         = source;

            //Create IQ decimator and oscilator
            oscillator = new Oscillator(SampleRate, config.baseband.freqOffset);
            decimator  = new ComplexDecimator(SampleRate, DecimatedSampleRate, config.baseband.decimation, config.baseband.decimationAttenuation, DecimatedSampleRate * config.baseband.decimationTransitionRatio);

            //Create all audio resources
            foreach (var o in config.audio_outputs)
            {
                AddResource(new AudioResource(o, this));
            }

            //Create all components
            components       = new SpectrumVideoComponent[config.components.Count];
            componentOffsets = new int[config.components.Count];
            for (int i = 0; i < components.Length; i++)
            {
                components[i] = ComponentFactory.MakeComponent(this, config.components[i]);
            }

            //Get the image dimensions by calculating the total height
            height = 0;
            for (int i = 0; i < components.Length; i++)
            {
                componentOffsets[i] = height * ImageWidth;
                height += components[i].Height;
            }

            //Create misc
            videoOutput   = outputProvider.GetVideoOutput(config.video_output.filename, ImageWidth, ImageHeight, config.video_output.frameRate, BufferSize);
            frameBuffer   = UnsafeBuffer.Create(ImageWidth * ImageHeight, out frameBufferPtr);
            buffer        = UnsafeBuffer.Create(BufferSize, out bufferPtr);
            textGenerator = FontStore.CreateRenderer(ImageWidth, ImageHeight);

            //Fill the entire canvas with black
            for (int i = 0; i < ImageWidth * ImageHeight; i++)
            {
                frameBufferPtr[i] = new UnsafeColor(0, 0, 0);
            }

            //Init all components
            for (int i = 0; i < components.Length; i++)
            {
                components[i].Init();
                components[i].InitFrame(frameBufferPtr + componentOffsets[i]);
            }
        }
Ejemplo n.º 3
0
        public ViewGenerator(SavedViewData info, int bufferSize, float sampleRate)
        {
            //Set
            this.info       = info;
            this.bufferSize = bufferSize;

            //Configure offset
            mutator            = new DownConverter(1);
            mutator.SampleRate = sampleRate;
            mutator.Frequency  = info.offset;

            //Configure decimator
            decimator   = new ComplexDecimator(sampleRate, sampleRate / info.decimation, (int)info.decimation);
            sampleRate /= info.decimation;

            //Get component list and image size
            components = info.CreateComponents(sampleRate, out width, out height);

            //Find out what workers are required
            foreach (var c in components)
            {
                fftRequired         = fftRequired || c.RequiresFft;
                demodulatorRequired = demodulatorRequired || c.RequiresAudio;
            }

            //Create these workers
            if (fftRequired)
            {
                fft = new FFTProcessorComplex(info.fftSize);
            }
            if (demodulatorRequired)
            {
                //Set up decimator
                audioDecimationRate = DecimationUtil.CalculateDecimationRate(sampleRate, info.audioBandwidth, out audioOutputRate);
                audioDecimator      = new ComplexDecimator(sampleRate, info.audioBandwidth, audioDecimationRate);

                //Set up demodulator
                demodulator = new WbFmDemodulator();
                demodulator.Configure(bufferSize, audioOutputRate);
            }

            //Initialize all
            foreach (var c in components)
            {
                c.Init(info, fft, demodulator);
            }

            //Create buffers
            iqBuffer = UnsafeBuffer.Create(bufferSize, sizeof(Complex));
            iqPtr    = (Complex *)iqBuffer;
        }
Ejemplo n.º 4
0
        protected override void PrepareBenchmark(int sampleRate, int bufferSize)
        {
            //Create buffers
            iqBuffer     = UnsafeBuffer.Create(bufferSize, out iqBufferPtr);
            audioABuffer = UnsafeBuffer.Create(bufferSize, out audioABufferPtr);
            audioBBuffer = UnsafeBuffer.Create(bufferSize, out audioBBufferPtr);

            //Create IQ decimator
            decimator = ComplexDecimator.CalculateDecimator(sampleRate, bandwidth, 15, bandwidth * 0.05f, out float decimatedIqRate);

            //Create demodulator
            demod = new WbFmDemodulator();
            demod.Configure(bufferSize, sampleRate, DecimationUtil.CalculateDecimationRate(decimatedIqRate, outputRateTarget, out float actualOutputRate));
            demod.UseRds();
        }