How to simulate in Simulink the FFT of "Sample-and-Hold"

Status
Not open for further replies.

pavel47

Member level 4
Joined
Nov 8, 2005
Messages
68
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,286
Location
Switzerland
Activity points
1,790
Hello,

I've met difficulties while trying to simulate sinusoidal waveform passed through "Sample-and-Hold" module.
On the snapshot below my model. When I run simulation, the error occurs:
Error in 'Sample_and_Hold_test/Buffer': All sample times must be discrete. No continuous or constant sample times are allowed
"Sample-and-Hold" block outputs continuous signal, but "Buffer" requires discrete one.
How to proceed ?
Thanks in advance.
P.S. Model is in attachment.


 

Attachments

  • Sample_and_Hold_test.zip
    18.4 KB · Views: 116

I had a similar issue some time ago, and I solved by replacing all the blocks before S/H ( including itself ) by a discrete input, more precisely an array of discrete values. The reason behind this error seems like the DSP blocks are generating discrete outputs, but in the continuous domain.
 

Re: How to simulate in Simulink the FFT of "Sample-and-Hold"

Can you, please, attach some screenshot ... frankly speaking I didn't properly understood what you mean.
Thanks.
 

There should be better alternatives to fix that issue, but the only one I see based on my previous experiments, could be by replacing all the stuffs before S/H blocks by an 1-D vector, in you case with the length of 4096 values. Don't know exactly what function could do that, but discretizer is the first one which come to mind.
 


Yes, it would be a solution ... i.e. transform the train of continuous values into 1-D vector in order to apply it to FFT, but unfortunately I didn't find any Simulink block capable to do it.
I turned my attention to "Zero-Order Hold" from Simulink "Discrete" library and also modified sinusoidal waveform output type from Discrete to Continuous.

This way "Zero-Order Hold" can be considered as "sampler".
Indeed it is the case - after "Zero-Order Hold" I can place "Buffer" and simulation runs, i.e. no error is generated.

Then I returned to my original task - simulate "Sample-and-Hold" behavior and its impact on incoming signal.
According to textbook (please see screenshot below), the "Sample-and-Hold" acts as filter having a characteristic sinc(x).
So if I apply, let say, 3 sinusoidal waveforms to such "Sample-and-Hold", it should filter out frequencies that close to Nyquist frequency.
But in my setup it doesn't ... all 3 sinusoidal waveforms manifest the same levels at the output of "Sample-and-Hold".
In correct simulation output of Sin_f3 < output of Sin_f2 < output of Sin_f1.

So, the conclusion is: "Zero-Order Hold" cant transform continuous signal into discrete , but can't "emulate" real "Sample-and-Hold"

So, the problem apparently quite simple ... persists.


 

Perhaps the Lookup Tables Block Library could make the job. There is already a 1-D Sin generator function there. According to the initial picture, this is exactly what you want to sample.
 

I've just tried your suggestion (at least as I understood it).
Unfortunately doesn't work ... well it works, but as in previous case "Sample-and-Hold" block doesn't manifest any filtering action ... i.e. the power level upon FFT doesn't change when input frequency changes.
Here below the results of 2 simulations:
  • f1 = 233Hz
  • f1 = 27133Hz
As you can see both have the same level, whereas the FFT output of 27133Hz must be much lower than 233Hz.

Fig.1 Model


Fig.2 Simulation with f1 = 233Hz


Fig.3 Simulation with f1 = 27133Hz
 

Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…