Home › Tutorials on Digital Communications Engineering
# Tutorials on Digital Communications Engineering

- Tutorial 1 – Basic concepts in signal analysis, power, energy and spectrum
- Tutorial 2 – What is Differential Phase Shift Keying
- Tutorial 3 – What is the DVB-S standard, a simplified version
- From Upcoming book “Intuitive Guide to Fourier Analysis”
- Chapter 1- Trigonometric Representation of periodic signals
- Chapter 2 – Complex Representation of Signals
- Chapter 3 – Discrete Time Fourier Series
- Chapter 4 – Fourier Transform of aperiodic and periodic signals (CTFT)
- Chapter 5 – Discrete Time Fourier transform(DTFT)
- Chapter 6 – Discrete Fourier Transform(DFT)
- Chapter 7 – Signal Windows
- Tutorial 7 – Hilbert Transform and the Complex Envelope
- Tutorial 8 – All About Modulation – Part 1
- Tutorial 9 – Baseband, Passband and Amplitude Modulation (AM)
- Tutorial 10 – All about Traveling Wave Tube Amplifiers (TWTA) and non-linear amplification
- Tutorial 11 – Link Budgets 101
- Tutorial 12 – Convolutional Coding and Decoding Made Easy
- Tutorial 13 – Coding Concepts and Block Coding
- Tutorial 14 – Inter Symbol Interference (ISI) and Raised cosine filtering
- Tutorial 15 – How to interpret an Eye diagram
- Tutorial 16 – Partial Response signaling and Quadrature Partial Response (QPR) modulation
- Tutorial 17 – Frequency Modulation (FM) , FSK, MSK and more
- Tutorial 18 – Unlocking the Phase Locked Loop (PLL) – Part 1
- Tutorial 19 – Unlocking the Phase Locked Loop (PLL) – Part 2
- Tutorial 20 – Modulation performance metrics and computation of BER
- Tutorial 21 – Linear Time Invariant systems and Matched filtering
- Tutorial 22 – Orthogonal Frequency Division Multiplex (OFDM, DMT)
- Tutorial 23a – About Lattice and cosets
- Tutorial 23b – Trellis coded Modulation (TCM)
- Tutorial 24a – Turbo Coding and MAP Decoding – Part 1
- Tutorial 24b – The MAP decoding algorithm, step-by-step Part 2
- Companion worksheet
- Tutorial 25 – Spread spectrum and CDMA – How cell phones work.
- Tutorial 26 – All my filters – Analog, Digital and Adaptive – Butterworth, Cbeychev, Elliptice, IIR, FIR, Adpadtive filters
- Tutorial 27 – Finding MIMO – A little bit more than a tutorial on MIMO!

###### 3 Pings/Trackbacks for "Tutorials on Digital Communications Engineering"

Hi! First of all, thanks a lot for all these tutorials, I am finishing my master degree in digital telecommunication and the tutorials helped me alot in different subjects! keep on the good work!

At this moment, I am working on TCM and I read many times your tutorial on it. My goal is to prove that using TCM, with a 2/3 rate convolutional coder and a QAM-16 constellation mapping, I can acheive the same or better coding gain then a standard 8-PSK modulation scheme. My problem is to actually find a good 2/3 convolutional encoder with a good minimum squared distance. I tried the one in the tutorial, but with the suggested QAM-16 constellation mapping, the shortest path, is definitly too short to get a significant coding gain. Do you have any suggestion regarding a good convolutional encoder for QAM-16 TCM?

I hope I was clear,

Thanks a lot,

JB

Hi, I really want to thank you for the effort you put in these amazing tutorials and I hope you keeping posting more and more of these tutorials. I just have one question about AM modulation:

“In AM synchronous demodulation, Why we don’t divide m(t)coswt by cos(wt)

instead of multiplying by cos(wt)?”

When I was taking a class in Analog Communication… I recall that I was watching one of the video lectures on signals and systems from Berkeley University, the Professor was talking (in that video recording of the lecture) about amplitude modulation and why when we want to demodulate an AM modulated signal , in synchronous detection, we multiply the AM modulated signal = m(t)cos(wt) by cos(wt), where w is the carrier frequency, and why we don’t just divide by cos(wt) to get m(t) back, since this can be easily implemented by a simple divider circuit.

well, he didn’t answer that question in the lecture, may be he just left it as an assignment for his students, I don’t know. but it just got me thinking about it, if it’s all about thinking mathematically, then it seems like it’s more intuitive and a whole lot easier if we just divide by coswt, why we go through all the trouble and multiply then we have to know the trig identity of (cos(a)cos(b)) and then put a BPF centered at w after the output…

While multiplication followed by a lowpass filter is equivalent to division, it is actually very different in implementation. The main problem with division is the issue of dividing by zero every period. This would cause amplitude spikes that would saturate the circuitry around the system. These can be avoided by syncing exactly the phases of the two cosines. Now instead of dividing by zero at t=2pi/w, there is cos(wt)/cos(wt) where both go to zero at the same time. Using L’hoptials rule, you can see that when t=2p/w, the output is 1 not infinity. But even if we managed to have perfect syncing, we still would have to build a divider circuit. These are more difficult to implement than a simple transistor mixer.

Overall its just much simpler to build and implement the mixer to lowpass than a division circuit. But mathematically they are completely identical!

Thanks for your reply Victor. I just don’t think that the L’hoptials rule will still work in circuit implementation. it is mathematically right, yes, but in practice, if the two cosines are in sync, then they eventually have to cross the value of zero at the same time, not just keep getting close to it, so you don’t get 1 here, but amplitude spikes.

I was also confused about it for years. Then I realized that it is actually division if you consider the modulation/demodulation operations in complex lowpass equivalent domain.

Divider circuits were not easy to build. That was the main impetus for doing it this way.

why it isn’t that easy to build a divider circuit? I mean are there actually divider circuits that can divide by a function(not a number like arithmetic dividers) or we’re able to implement a divider circuit that can divide by a sinusoid function like cosine, but it’s much easier to implement a multiplier circuit than a divider one.

At this moment, I am working on fft/ifft for OFDM and I read many times your tutorial on it. My goal is to prove that using FFT/IFFT, with a 2/3 rate convolutional coder and a QAM-16 constellation mapping, I can acheive the same or better coding gain then a standard 8-PSK modulation scheme. My problem is to actually find a good 2/3 convolutional encoder with a good minimum squared distance. I tried the one in the tutorial, but with the suggested QAM-16 constellation mapping, the shortest path, is definitly too short to get a significant coding gain. Do you have any suggestion regarding a good convolutional encoder for QAM-16 TCM?

I hope I was clear,

Thanks a lot,

you are the best … , ever

Am studying analog anddigital communication,I really don’t understand the terms like QAM,FPSK,QPSK,FSK ETC

Well then you should read some of these tutorials I have here, particularly the one on modulation which explains what these terms mean.

ma’am will u plz mail me a tutorial on ofdm

I am happy to point you to it, but it is right there on the list of Digitial Communications Tutorials on the front page.

http://complextoreal.com/tutorials/tutorial-22-orthogonal-frequency-division-multiplex-ofdm-dmt/#.UZk7z7U-anM

I am wondering if you are looking for something else?

Charan Langton

“In AM synchronous demodulation, Why we don’t divide m(t)coswt by cos(wt)

instead of multiplying by cos(wt)?”

The divider circuit (or the system that divides m(t)coswt by cos(wt)) is non-invertible system. In the whole modulation and demodulation process we want a robust transmission of m(t).

Divider circuits are non-invertible systems. Here our system is just passing the message signal to the receiver terminal. If we are passing m(1) then we will get m(1) at the receiver but if we wish to transmit m(pi/2) then you cannot obtain m(pi/2) at the output…. you will have an indeterminate mathematical form which is not desired…

Hi,

I have been an electronics engineer for nearly a decade. Although I was only recently steered towards this site by a friend, the experience of going through these tutorials was like meeting a friendly and extremely interesting stranger whose charm does not fade with time, thank you for this excellent content and wishing you the very best.

Awfully nice of you to say this – Charan Langton

I have a basic doubt. Consider a sine wave, if you take two times the sampling rate according to nyquist theorem. If 2 samples taken in a single period is at 0degree and 180degree.. Then we end up having all zeroes.. Can you please explain it?

Okay, what sine wave can you fit through these two points? Many, but the one with the smallest frequency is 1 Hz. And that/s all Nyquist is saying.

Actually the 0 points mean that you have used a NYquist frequency that is exactly 2 timrs, but the definition says it needs to be larger than two tims the maximum frequency even if infinitesimally. Once you increase it a tiny bit, more than two times, you will not get those zeros and then can fit many harmonics through those points.

Charan Langton

Hi,Charan

Can you explain more clearly about peak to average power ratio in matrix persepctive or other ?

Just wanted to offer a sincere thanks for going to the trouble of putting together such a great site. You have a gift of making complex concepts easier to understand. This is a great use of the internet.

Best regards. Jim

Thank you very much, Jim. Very much appreciate it.

Charan Langton

Loral Space Systems

I and my students are very thankful to you Charan for your tutorials and sincere efforts to make the tutorials easy and quick explanatory.especially your tutorial on Viterbi has helped me a lot to understand and teach precisely .

Hope to see some book on Communication soon.

Hi Charan,

Your tutorial on OFDM was simply superb. A complex concept is explained very simple with comparisons to single truck shipment and multi truck shipment analogies and also water flow in faucet and shower analogies…. Hats off man…. Thanks a lot…

Good analogy towards the complex concepts…..!!

found it worth sharing..

thank u…

Hi,

I don’t know whether this question can be asked here. But kinldy guide me, if you know the answer

I have a 3 node system, with nodes in a line and the center node is taken as receiver equidistant to the other nodes.

My objective is to get BER at receiver in Rayleigh fading channel, with one of the nodes as interferer to the other node’s transmission and BPSK modulation is used.

With fading channel coefficients known at receiver as h1, h2, I tried to get BER using threshold detection as

Assuming source transmits +1, BER is

P(received signal<0)=P(|h1|+|h2|i+n<0) {where i:signal from interferer (+1, -1)};

n: AWGN

=P(n<-|h1|-|h2| given i=+1)*P(i=+1)+P(n<-|h1|+|h2| given i=-1)*P(i=-1)

Finally I averaged over |h1| and |h2|.

Then it is observed that BER with fading is lower than Ber without fading for high values of SNR.

Kindly let me know whether this analysis is correct.

Thanks in advance,

Regards

Kris

Hi Kris,

Not clear if you are going a simulation or a closed form solution.

You will find the comparison of the closed form BER for a fading vs. a AWGN channel in my MIMO tutorial.

And yes, you should get a higher BER for for same SNR under a fading channel.

So you have some issue in your analysis.

Charan Langton

Hi Charan,

Awesome tutorials. I’ve been working on designing an OFDM scheme for a a channel. We were told to assume that a channel bandwidth of 1MHZ is available.

The channel has the following multipath profile:

t(us) 0 1 2 3 4 6

P(db) 0 -10 -20 -0 -20 -20

I am asked to determine the required frequency spacing for the subcarriers such that each subchannel experiences a flat channel. Determine the resulting OFDM symbol period and Cyclic prefix to ensure no ISI among OFDM symbol.

So far this is what I’ve done:

my delay spread is : 1.49us

Bc0.9: 13.3 KHz, therefore my subcarrier frequency spacing is 13 KHz.

Number of subcarriers : 76.92

My OFDM symbol period is: 76.92us

when it comes to finding out the CP, i’m not sure if I can assume it to be 5us.

Am I on the right track here or really off it?

HELP PLS.

Your CP needs to be just a little greater than your delay spread.

Charan

Thanks a lot Charan, your reply brought me back to life.

I actually thought that CP needed to be greater than the second moment of the power delay. It makes more sense now.

Can I conclude my required frequency spacing for the sub-carriers to be 13 KHz ( as I got a Bc0.9= 13.3 KHz)and a a symbol period of 76.92us, so that each sub-channel will experience a flat channel?

Thanks for your help and advice.

hi Jorge, the frequency spacing should be more than the coherence bandwidth. Can you calculate that and see if it is near the 13 kHz. The other thing is that you need a power of two number of carriers so if your total bandwidth divided by the 13 kHz is not the power of 2 number, then you will have to zero pad those extra carriers and can not count them as carrying data.

Charan

Hi Charan,

I’ve been working on calculating that frequency spacing. I came across an info which states that the sub-carrier spacing is the inverse of the symbol time less the guard period; and that the guard time must be 2-4 times the delay spread. Is this accurate?

Btw, I thought that for flat fading the sub-carrier spacing needed to be below than the coherence bandwidth.

Anyway, I’m a bit confused, but i’ll keep trying to calculate that sub-carrier spacing.

Thanks

I am going to assume that this is the max delay spread. Now the coherence BW is 1/DS = 666666 Hz. (I had a 2pi factor before, ignore) This is less than your bandwidth of 1 Mhz, so the channel will experience fading, but not a lot.

So any spacing for the sub-carriers less than this amount will do.

The number of carriers will depend on the standard you want to use. If you use 802.11, and you choose 48 carriers, this will give you a spacing of 20.8Khz.

For 48 carriers, we get Tn = 48mus.

Cyclic prefix we can set as 1/8 of above or 6 mus.

Symbol time would be 48 + 6 = 54 mus.

Throughput is 1 msps minus the CP overhead.

Charan

Coherence bandwidth relates more to total symbol rate. It is directly related to delay spread.

2pi/d. For the delay spread, you do not need four times the delay spread, that would be adding a lot extra overhead. No more than x2 would be my choice.

Yes, the spacing needs to be less, not more than coherence bandwidth not more. I said it wrong.

Your coherence BW comes to about 4 MHz, but you are allocated 1 MHz. So you are limited in spacing by how much data you want to transmit. The maximum is 1 Msps which would require app. 1 Hz spacing and 1 kHz of data would need app 1 kHz spacing. (minus the CP overhead in each case). Hope this helps.

Are you using a standard OFDM or can you create anything you want?

Charan Langton

Thanks again Charan,

I’m using standard OFDM. All I have to work with is the multipath profile, which is :

t(us) 0 1 2 3 4 6

P(t)(dB) 0 -10 -20 0 -20 -20

And of course, a channel bandwidth of 1 MHz available. I began by determining the required spacing for the subcarriers such that each subchannel experiences a flat channel.

For this I calculated the first moment of the power delay profile (taking into account the multipath profile), which came to 1.51us. Then I calculated the second moment of the power delay profile, which resulted in: 4.53us.

Having these results I then estimated the delay spread, which resulted in: 1.5us. Then, my coherence bandwidth: BC0.9: 13.3 KHz (and BC0.5: 133.3 KHz). I only took into account BC0.9, hence I assumed a frequency spacing of 13 KHz.

When you say that my coherence bandwidth comes to 4Mhz, is there something I’m miscalculating? or not seeing when applying the formula?

I know asking this may be silly, but I rather ask than regret later. Sorry for dragging this issue.

Thanks a lot Charan.

By using Wc:2pi/d you’ll get 4.18 Mhz, around 4Mhz, but When using Bc0.9 formula according to you multipath the result is different. I’m fairly new to OFDMA, so that’s all I can do to help you. Wait to c what Charan has to say about it.

Sorry Pal.

i studied bandwidth so much that i dont even know what it is anymore!

for instance 1.laser has higher bandwidth than led’s

2.optical fibre bandwidth is 10^20 hz something ,which has many channels than copper wire

3.copper wire and optical fibre are just single conduit ,how can they have may channels .

these are silly questions but i studied so much on this ,,, i am not able to get insight on this

please clear my doubts

It helps to think of bandwidth as lanes with finite widths on a freeway. Let’s say that the freeway is 500 feet wide. We have six lanes, one on the left edge is narrow and only 20 feet wide. Then we have a wide lane which is 150 feet wide, then we have three more at 100 feet wide. Then we have one at the right edge which is also 20 ft wide. The total space taken up by these lanes is 20+150+3(100)+30 = 500. Now give these lanes name.

Lane 1: 0 – 20 ft, A Band

Lane 2 – 20 – 170 ft, B Band

lane 3 – 170 – 270, C Band

Lane 4 – 270 – 370 ft, D Band

Lane 5 – 370 – 470 ft, E Band

Lane 6 – 470 – 500 Ft, F Band

The freeway is the electromagnetic spectrum, for 0 Hz to infinity Hz. We divide it into lanes of certain frequency band and those are called bands. Each media is capable of operating in only a few of these bands. Energy can travel in wires only in the lower bands, wireless can operate in pretty much all. The regulatory bodies control at which frequency you can transmit and assign you a small part of a band, and that is the bandwidth that you are assigned. You as an operator can then further subdivide the allowed band if you want, or use all in one channel.

For example, a satellite operator is allowed to use a band of 12 GHz to 13 GHz for downlink. He can take this 1000 MHz and then subdivide into ten 100 MHz channels. Then he would design his system for 100 MHz (often called transponders) and then place these like lanes on a freeway next to each other separated by 100 MHz center frequency. Each of these sub-bands then has a center frequency and a bandwidth, which is of course 100 MHz, the width.

A media has a bandwidth “capability” but then there is the bandwidth that you are allowed to use. So one is the characteristic of the transmission media and the other is where you are allowed to operate.

The allowed frequencies are allocation by the ITU and best thought of as lanes on a road where you may drive and the media capability is best thought of as the with of the car that travels in that lane. The car with width is the media capability and it is always less than the allowed band in which it operates.

In this picture the colored bands are the allowed ranges.

http://static.ddmcdn.com/gif/cell-phone-radiation-spectru.gif

Charan Langton

‘

thanks

i will be glad to see the analysis of blind channel equalization algorithms, especially adaptive one basing on stochastic gradient methods. honestly i have to thank you a lot for your support in academic success.

I think I covered some of this in the adaptive filter tutorial. Let me know if any of that was helpful.

Charan

I’m looking for the mathematical expression for Pulse Width Modulation. I believe it is something close to the following,

Y(t)=X((t/W)+Theta) (Y is modulated signal, X is square pulse, W is width and Theta is phase shift)

Please correct me if I’m wrong.

Naveen

Hi Charan,

I would like to thank you for this information and congratulate you on all the effort you must have taken to provide this information.

I sincerly thank you again.

Regards,

KJ

hai mam i am doing my BE final year.I am gng to do project on “energy efficiency power adapative spatial diversity” the ppaper wasx published in IEEE .kindly give me an idea how to make changes in this paper mam.

hello…

i am zeeshan and pursuing master in broadcast technology. sir i got confused how a transport stream get divided in transponder bandwidth in DVB-S.

Its usually a bit stream and it is demultiplxed, which is a sort of a decimating process. I am not sure of your question, so thats that best I can do.

Charan Langton

Hi, your website has really helped a lot in understanding of digital communication. Tutorial of raised cosine pulse shaping and isi Are explained in much simple and clear form. Thanks a lot for your efforts.

why intereference is minimum in case of orthogonal signals?

why intereference is minimum in orthogonal signals?

Hello, pleasse do you have a good write up also on demodulation just like you have on demodulation.

Charan, simlpy the best explanation of modulation techniques I have come across in my 20 years in Broadcast engineering. Others tend to leave out the realisation of the modulators, however your step by step and diagramtic approach is simply magic.

dave

Can u please help me with constellation diagram 3pie/8 shifted 8-psk. how to calculate average value and minimum value of the envelope

can yuo plz help me tutorial about carrier frequeny offset

I’ve read the ofdm pdf . that was great amazing but for continuing i need more …??!

i download many pdfs but yours was really helpful

(sorry if i made mistake about writing)

Thank you for your effort

EXTREEMELY INFORMATIVE AND INTERESTING TUTORIALS IN DIGITAL MODULATIONS PRINCIPLELS UNDERSTANDING AND THE FUNDAMENTAL CONCEPTS ARE MADE VERRY CLEAR-I AM AN ELETRICAL ENGINEER TRYING TO UNDERSTAND THE FUNDAMENTALS IN COMMUNICATION THEORY AND PRACTICALS IN THIS ERA OF COMMUNICTIONS.-I AM EXTREEMELY THANKFULL TO YOU FOR PROVIDING THIS INSIGHT INTO DITAL MODULATIONS SO CLEARLY AND IN SIMPLE CONCEPTUAL MANNER WITH APPROPRIATE DIAGRAMS AND WAVE FORMS-I AM HIGHLY OBLIGED TO YOUR TUTORIALS PUBLISHED ON LINE.-THANK YOU IMMENSELY.

Love your website , you should become teacher/professor

Regards

Amir

Thanks a lot!

I found it fantastic.

Hi,

First of all I must say that, all the chapters written on this website is a great resource.

Many thnaks for expaling digital communication in such a simple way.

I was going through Inter Symbol Interference and Root Raised Cosine Filter chapter.

I have one doubt in the example of satellite transponder on page 11.

Probably I am missing something here to understand it.

The doubt is,

When we use QPSK ( or any PSK ) , we use the sine and cosine waveforms to send the signal which is already in bit stream form.

The bit stream form is has square shape pulses.

But QPSK modulated signal will have portion sine and cosine waveforms.

So the question is why do you say that the “unshaped” QPSK is square pulsed.

Pardon me if I am not able to understand the context of “unshaped”.

In any case, if a signal is digitally modullated then the bits would be sent in the form of sine and cosine only.

So why do you say that pulse shaping is required on the square pulse before sending.

Regards,

Anirudha

Firstly i want to thank you for putting together such good tutorials. I am doing my masters in Communications and Signal Processing. This forum has helped me a lot since the commencement of my degree. I have a request if you can take out some time to prepare a tutorial on FBMC (Filter Bank Multi Carrier) modulation scheme. Currently, I am about to start a project on this topic but can not find a specific and to the point tutorial on this topic. Your effort would be really appreciated.

Thank You

its understanding to good

Hi Charan,

The information on Fourier analysis was really awesome. Big Fan !!!!

Hi,

Thanks for such beautiful and amazing notes. They really made my mind to jump from complex to understandable fundamentals.

Thanks! Very good tutorial

Fantastic and very useful. May God bless the originatar/(and consequent forwarders) for this remarkable service.

Hello Ms. Charan! Your tutorials have helped much more than entire semesters of wireless comm classes combined. Please keep up the good work.

Will you be posting any tutorials on wireless channel modeling and MIMO-OFDM? It would be very beneficial as channel modelling is a common but challenging topic and MIMO-OFDM is the technology of choice, but the mathematics and concepts may be difficult to grasp at first hand. Please let me know

need a written program on free space optical link for channel interference reduction

Hi…few pdf are not accessible (ffts). Please help

Which ones are missing? Occasionally I notice that some don’t show up some times and then reappear at a later time. Internet Magic!

Hi:

In your tutorial number 7 on the Hilbert Transform, under the heading “What is the analytic signal of a sine?” I think there is a small error in the reduction of sin(wt) – jcos(wt) into a complex exponential which should be -je^{jwt}.

On the whole, the couple paragraphs below it make it seem like all complex exponentials have a spectrum only in the positive domain which is slightly confusing. For instance, e^{-jwt} does not. A proof that the hilbert transform results in positive frequency would be great.

Thank you very much for these tutorials. I’ve only gone over the hilbert one and the intuition and simplistic walk-through with the example really helped me understand the basic concept.

Thank you for posting your comment about the error. I have not had the time to go back and revise the tutorial but I do plan on doing it.

Charan Langton

Apologies. I understand there is a proof right below.

Your tutorials are exellent regarding the explanation but there are so many mistakes with the math. You need to go through them as it can be confusing when equations make no sense! however i still value your work. if you correct this then it is perfect.

Any specific page/tutorial?

I keep wanting to update them but in some cases, I can’t not find my original files.

Maybe I will have to rewrite them.

Thank you so much for your kind words.

Charan

i think the discrete time signals and fourier series representation has the most mistakes in it. for example bottom of page 42 should be pi/2 not pi/4. page 43 should be c(0), c(1), c(2), c(3).page 44 the 1/N terms have been omitted in the c(k) calculations… there are a lot more. also you often draw the 3D sine wave representation as having a +90 degree phase for the positive freq and -90 for the neg freq but i think it is the other way round. see page 2 or your hilbert transform tutorial (which is very good). you do state that the cosine into sine tranformation requires a -90 shift for pos freq and -90 for neg freq which is correct and contradicts the previous statement and diagram. however your axes are not labelled regarding the directions of positive and negative so you may be correct in your pictures however if you are using less conventional axes directions it would be good if they were labelled. i think I am correct in most of this. best wishes

sorry i meant -90 for pos freq and +90 for neg freq is correct

Great Site, thank you!

Hi,

Firstly thank you for the wonderful explanation/work.

Just have a comment, I think in Chapter 12, Fig 10a, the outbit must be 11110111010111, instead of 11011111010111.

Regards,

Basant

Muito bom! Obrigado pela ajudar!

Very good!Thank you!

Your notes made my life easy. I have no words to express my gratitude.

Thanks Sir

Thanks alot for your effort and contributions. These tutorial are really helpful.

Thank you so much for such a wonderful collection. It has helped me a lot.