I've been using a USRP software-defined radio to try to send an amplitude modulated signal to a very basic receiver, basically just a piece of wire as an antenna, over a very short distance. The signal, a wav file of me counting to ten, is transmitted clearly enough to be understood by a human, but not by a speech-to-text program. The received signal is also clearly much higher in frequency than the transmitted signal. I took FFTs(illustrations provided below) of the sent and received signals and it seems clear to me that the lower frequencies in the signal are not being transmitted as strongly. The solution I've been trying to work on is adjusting the signal I'm transmitting by amplifying the lower frequencies of the signal and attenuating the higher frequencies using Python to modify the original wav file. My question is whether this seems like a viable solution or not? Is it possible to make up for a transfer function that is making it difficult to transmit the low frequency parts of the signal by amplifying those parts of the signal in the file to be transmitted?

fft of signal sent fft of received signal

Here is the GnuRadio flowchart I'm using for the USRP transmission:

GnuRadio flowchart

  • $\begingroup$ How are you detecting the RF - do you have a diode in there somewhere? What is the carrier frequency? Can you post a circuit? You should be able to make quite a good simple AM radio for strong signals. $\endgroup$ – tomnexus Jun 30 '15 at 17:47
  • $\begingroup$ The carrier frequency is 1110 mhz, I picked that by just sweeping a range until I found the frequency that was picked up most strongly by the wire that I'm using as a receiving antenna. I can't really post a circuit, the receiver is essentially a wire attached to a microphone such that the microphone is picking up what is received by the wire as an audible signal like it would a person speaking. I can't really alter the receiver in what I'm doing, I can only really change things on the transmission side. $\endgroup$ – pineapplevendor Jun 30 '15 at 18:10
  • $\begingroup$ Are there common reasons why a range of frequencies might be lost? $\endgroup$ – pineapplevendor Jun 30 '15 at 18:12
  • $\begingroup$ OK, so you're using an untuned receiver, but that isn't necessarily crazy. Could you post more details about your transmitter, like the code of the program you're using to drive the USRP? Your spectrums look nothing alike and I wonder if you've got some error like clipping on transmit. $\endgroup$ – Kevin Reid AG6YO Jun 30 '15 at 18:31
  • $\begingroup$ @KevinReidAG6YO Ok, I've posted the GnuRadio flowchart that I'm using to generate the transmission. $\endgroup$ – pineapplevendor Jun 30 '15 at 18:44

You are not making an AM transmission, because you have not added a carrier. Without a carrier, what you have is double sideband (DSB) modulation, which will not be properly demodulated just by an improvised detector.

To create the carrier, add a constant value to the signal (between the Multiply Const and Float To Complex stages).


  • The carrier should be of greater amplitude than the peak level of the modulating signal, to avoid overmodulation.

  • You should also make sure that the final signal does not exceed a level of ±1, which would cause it to be clipped (distorted) by the USRP's DAC or a preceding float-to-integer conversion.

Together, these constraints mean that for best dynamic range your carrier should have a value of 0.5, and the input signal, if it had a maximum range of ±1 (which I believe is true for GR WAV sources, but your file may be significantly quieter), should be multiplied by 0.5, so that the resulting signal has a range of 0 to 1.

I would recommend visualizing your signal by adding a GUI FFT Sink in parallel with the UHD sink, to observe that it has the proper spectrum of an AM signal. If you wanted to simulate the effects of quantization and possible clipping, you could do so by converting the signal to short or byte and back before feeding it to the FFT sink.

  • $\begingroup$ Thanks a bunch for your help, but what do you mean between -1 and 1? I'm using Python to write the wav files; when using the scipy wavfile module it doesn't seem like the range of values is confined to between -1 and 1 when using the 16 bit format. Do I have to do the scaling myself to make sure all the numbers fall into that range? $\endgroup$ – pineapplevendor Jun 30 '15 at 19:18
  • $\begingroup$ @pineapplevendor scipy may have a different interpretation of sample values (e.g. 16-bit integer instead) than GNU Radio. I believe GNU Radio's wav source will rescale the samples to be within ±1 (the convention for this sort of floating-point DSP), but I don't have it in front of me to check. Also, I just remembered that I can be more specific about how to set the carrier level, so I added that info. $\endgroup$ – Kevin Reid AG6YO Jun 30 '15 at 20:41
  • $\begingroup$ After playing around with this a little bit more, I think the rescaling from 16 bit int to 16 bit float is being done because the signal has improved a lot. I still had a bit of a buzzing after making your suggested changes but lowering the gain fixed that. Thanks. $\endgroup$ – pineapplevendor Jun 30 '15 at 21:59

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.