Wave Walker DSP

DSP Algorithms for RF Systems

Trending

Buy the Book!

DSP for Beginners: Simple Explanations for Complex Numbers! The second edition includes a new chapter on complex sinusoids.

Calculate Signal to Noise Ratio (SNR) in Python Simulation
July 1, 2024

Table of Contents

Introduction

This blog performs a simple math derivation for SNR and then verifies the results with a Python simulation.

Check out these DSP blogs!

Calculating SNR Mathematically

An example received signal x[n] is the addition of the signal s[n] and the noise w[n],

(1)   \begin{equation*}x[n] = s[n] + w[n].\end{equation*}

The SNR of the received signal x[n] is the ratio of the power for the signal P_s to the power of the noise P_w,

(2)   \begin{equation*}SNR_{x} = P_{s} / P_{w}\end{equation*}

where

(3)   \begin{equation*}P_{s} = \mathbb{E} \{ s[n]  s^*[n] \},\end{equation*}

(4)   \begin{equation*}P_{w} = \mathbb{E} \{ w[n]  w^*[n] \}.\end{equation*}

The expectation operator \mathbb{E} \{ \cdot \} operates as an average or mean. It is assumed that x[n] is N samples long beginning at time n=0, therefore the average signal power (3) can be written according to

(5)   \begin{equation*}\begin{split}P_{s} & = \mathbb{E} \{ s[n] s^*[n] \} \\& = \frac{1}{N} \sum_{n=0}^{N-1} s[n] s^*[n]  \\& = \frac{1}{N} \sum_{n=0}^{N-1} |s[n]|^2.\end{split}\end{equation*}

Similarly, the average power of the noise (4) is 

(6)   \begin{equation*}P_{w} = \frac{1}{N} \sum_{n=0}^{N-1} |w[n]|^2.\end{equation*}

The SNR of x[n] (2) is therefore [Lyons2011, p.875]

(7)   \begin{equation*}SNR_{x} = \frac{\frac{1}{N} \sum_{n=0}^{N-1} |s[n]|^2}{\frac{1}{N} \sum_{n=0}^{N-1} |w[n]|^2}\end{equation*}

which can be written in decibels as

(8)   \begin{equation*}\begin{split}SNR_{x,dB} & = 10\text{log}_{10}\left( SNR_{x} \right) \\& = 10\text{log}_{10}\left( \frac{P_{s}}{P_{w}} \right).\end{split}\end{equation*}

Calculating SNR with Python

Python is used to generate two signals, a BPSK signal and real Gaussian noise. The BPSK signal is generated by the following Python code:

 import numpy as np
numSamples = 4096
symbolMap = np.array([-1, 1])
mapIndex = np.random.randint(0,len(symbolMap),numSamples)
symbols = symbolMap[mapIndex]

The average power of the symbols (5) is calculated and printed by:

 Ps = np.mean(np.abs(symbolMap)**2)
print('signal power = ' + str(np.round(Ps,2)))

which results in:

 signal power = 1.0

The real Gaussian noise is generated by:

 noise = np.sqrt(0.01)*np.random.normal(0,1,numSamples)

The average noise power (6) is calculated and printed by:

 Pn = np.mean(np.abs(noise)**2)
print('noise power = ' + str(np.round(Pn,2)))

which results in:

 noise power = 0.01

The SNR is the ratio of the signal power to the noise power, which is calculated and printed by:

 SNRdB = 10*np.log10(Ps/Pn)
print('SNR (dB) = ' + str(np.round(SNRdB)))

which results in:

 SNR (dB) = 20.0

Figure 1 is an example of s[n], w[n] and x[n] in the time domain as generated by the example Python code.

A BPSK signal s[n], real Gaussian noise w[n], and the received signal x[n] = s[n] + w[n] for SNR = 20 dB
A BPSK signal s[n], real Gaussian noise w[n], and the received signal x[n] = s[n] + w[n] for SNR = 20 dB

Conclusion

This blog provided a simple mathematical backing for how to compute SNR mathematically and then provided Python code for how to generate an example BPSK and then compute it’s SNR.

Check out these DSP blogs!

Leave a Reply

For everything there is a season, and a time for every matter under heaven. A time to cast away stones, and a time to gather stones together. A time to embrace, and a time to refrain from embracing. Ecclesiastes 3:1,5
The earth was without form and void, and darkness was over the face of the deep. And the Spirit of God was hovering over the face of the waters. Genesis 1:2
Behold, I am toward God as you are; I too was pinched off from a piece of clay. Job 33:6
Enter His gates with thanksgiving, and His courts with praise! Give thanks to Him; bless His name! Psalm 100:4
Lift up your hands to the holy place and bless the Lord! Psalm 134:2
Blessed is the man who trusts in the Lord, whose trust is the Lord. He is like a tree planted by water, that sends out its roots by the stream, and does not fear when heat comes, for its leaves remain green, and is not anxious in the year of drought, for it does not cease to bear fruit. Jeremiah 17:7-8
He said to him, “You shall love the Lord your God with all your heart and with all your soul and with all your mind. This is the great and first commandment. And a second is like it: You shall love your neighbor as yourself. On these two commandments depend all the Law and the Prophets.” Matthew 22:37-39
Then He said to me, “Prophesy over these bones, and say to them, O dry bones, hear the word of the Lord. Thus says the Lord God to these bones: Behold, I will cause breath to enter you, and you shall live." Ezekiel 37:4-5
Riches do not profit in the day of wrath, but righteousness delivers from death. Proverbs 11:4
The angel of the Lord appeared to him in a flame of fire out of the midst of a bush. He looked, and behold, the bush was burning, yet it was not consumed. And Moses said, “I will turn aside to see this great sight, why the bush is not burned.” When the Lord saw that he turned aside to see, God called to him out of the bush, “Moses, Moses!” And he said, “Here I am.” Exodus 3:2-3
Daniel answered and said: “Blessed be the name of God forever and ever, to whom belong wisdom and might. He changes times and seasons; He removes kings and sets up kings; He gives wisdom to the wise and knowledge to those who have understanding." Daniel 2:20-21
Now the Lord is the Spirit, and where the Spirit of the Lord is, there is freedom. 2 Corinthians 3:17
Previous slide
Next slide

This website participates in the Amazon Associates program. As an Amazon Associate I earn from qualifying purchases.

© 2021-2024 Wave Walker DSP