Thank you so much for the detail reasoning which helped me a lot for understanding. Thank you all!
Sincerely, Milo On Wed, Aug 12, 2009 at 11:27 AM, Johnathan Corgan < [email protected]> wrote: > On Wed, 2009-08-12 at 10:00 -0700, Milo Wong wrote: > > > I was wondering if there is anyway to obtain the binary output from > > audio source in GRC. I need this bits information as modulating signal > > for ASK. Since sound card digitized our analog voice signal to binary > > information in 16bits (suppose the sound card is 16bits), so I think > > it should be a way to directly obtain the 16bits binary output of each > > float symbol from audio source. I used to digitize them through "float > > to byte" type conversion, however, it would lost a lot of dynamic > > range since byte is only 8bits which is too imprecision. > > > > I've been confused by this question for a long time. Is there anybody > > who can help me? Thank you in advance! > > The audio sources in GNU Radio provide a single-precision floating point > output stream with a dynamic range from -1.0 to 1.0. > > Digital modulators in GNU Radio typically require a stream of "unpacked > bytes", where each byte in the stream contains one or more LSBs > representing the symbol you wish to modulate. BPSK modulation has two > symbols, so these are represented by a '0' or '1' as the LSB. QPSK has > four symbols, and these are represented by '00', '01', '10', and '11' in > the the two LSBs. Other modulators are similar. > > So your goal is to figure out how to convert a series of floating point > samples representing an analog data source (audio) into a series of > unpacked bytes appropriate to feed your modulator of choice. In digital > comms, this is the job of a vocoder. Different vocoders result in > differing properties of your communication system, such as data rate > required, fidelity of the audio demodulation, effect of noise, and what > happens when there are gaps in the packet stream. > > The simplest route you can go is to use the sample stream unmodified, > which would give you a "signed-linear PCM" codec. First, you would pass > your sample stream into a multiplier to get the dynamic range from > [-1.0,1.0] to [-32767.0:32767:0]. Then you use the type conversion > block gr.float_to_short() to turn this from floating point into signed > short integers of [-32767,32767]. Finally, you pass them through a > gr.packed_to_unpacked_ss block with the right number of LSBs to turn > them into symbols appropriate to your digital modulation. > > Signed-linear PCM is generally not used in RF comms as it requires a > very wide bandwidth compared to other codecs. If you are sampling voice > at 8000 sps, then it takes 96000 bps (16 bits per sample) to encode the > voice stream. It also degrades very poorly in the presence of noise or > missing frames. > > GNU Radio has an implementation of the GSM full-rate codec. This takes > audio at 8000 sps and generates a 13 Kbps stream of compressed audio. > The GNU Radio GSM codec takes signed-linear shorts in and outputs > 33-byte GSM frames, which you then need to modulate accordingly. > > For an example of how this is done in practice, look at the tx_voice.py > script in the digital examples. There is additional work involved in > taking the GSM frames and encoding them for packet-based transmission, > but the part about getting from voice to digital is there. > > Johnathan > >
_______________________________________________ Discuss-gnuradio mailing list [email protected] http://lists.gnu.org/mailman/listinfo/discuss-gnuradio
