One of the most complex it's a pretty simple thing actually. So we heard from Francesco He talked about OTP a little bit on OTP behaviors OTP applications is another behavior that comes bundled with the beam so they're relying VM and The idea of an OTP application is that you have these different Processes running and there's a supervision tree And that's all packaged in a bundle that you can then send to other Other beams and that it will just run to deploy that that's just a convention of how to bundle applications umbrella apps are Nothing more really than Another convention of how to have multiple applications inside of a bigger bundle. That's your umbrella That's gonna wrap them all together Now, what's the the advantage you might ask of having an umbrella app versus just having many apps? It's really just about the convention. I think so there that your tooling is gonna be aware of this. So for instance mix Peter was talking about mix the the tool very important tool if you're doing elixir if you run tests You can run the test for all the applications together When so that's a big thing for dependencies as well If you run mix depths get on the top app, it will get the dependencies for all the applications That's cool. That's cool. If you're using Phoenix, which is the one of the main web frameworks for elixir It's also aware of what a Braille apps are and if you create a new Phoenix app inside of the umbrella The generators will behave a little bit differently Distillery which is a deployment Library also is aware of umbrella apps and even allows you to deploy as a single app or you can specify How you want each different app to behave when you're deploying? So it's just really a convention and a nice convention to have these different apps that are all If you want to call them services, they're all part of this bigger bundle The ways you start or you create a new umbrella app is really just using mix new same thing as your when you're creating a Regular elixir app, but you have the dash dash umbrella at the end. That's an option So this will create these files particularly interesting is this apps directory instead of a lib directory And these apps directory is gonna be empty at first. So there's really no Application code because this is just a bag for you to put your applications And then it's as easy as really see CDing into these apps directory and doing mix new and creating apps inside of there And that's it as simple as that So that's about it about umbrella apps that I wanted to talk talk to you about the technicals of it It's really this simple the part that really excites me and really got me into Umbrella apps and how they could be used is more about how to build a maintainable application or what I think Could be a ways to to build them a more maintainable application And then so I want to talk about a little bit about this and then how to apply this to two umbrella apps So right now there's a lot of frameworks out there and I'm not gonna focus specifically on web But that's mostly what I do. So If something doesn't make sense, maybe I'm just talking about web frameworks But there's a lot of frameworks that make it easy to build an app But not necessarily a maintainable one. So very famously rails a few years back had the 15 minute blog And yeah, that's cool. I can make a blog in 15 minutes But if that blog grows to be like a major thing will the same patterns still still hold true For a bigger team and for a different scalability Problems that I might have some symptoms that I I've seen in my experience starting to express themselves when You start having these issues of the framework not really being maintainable and not scaling with with a team and the and the project is Something that happens is you can start to have these very large files as your app grows Because a lot of things just keep going to the same files and that just just became become this bucket of Behavior that is really hard to understand which leads to a slower pace and getting stuff out the door And this is obviously the the biggest issue actually This is also do my opinion to a High coupling between your components, which means you start having these different classes or modules or whatever Packages and they're all very coupled to each other They all try to get a behavior and communicate with each other when sometimes they really shouldn't there's just a Level of abstraction or some abstractions that you're doing that. They're not really correct Another thing that you start seeing is low cohesion Which means that inside of these classes or these modules you start to have a lot of behavior that doesn't really Match with the rest of the behavior on the class a very common Example of this is for instance in a web app The user class or the user model where you can start you have like behavior for like authentication or Something like that and then you start adding things more specific to your app to the to that user model as well and Then you're now really conflating these Concepts that shouldn't be together and that leads to these large files and sort of place and all of that so this is some of the Symptoms that I that I see and I believe they all come from this overarching problem Which is not really thinking about how to model your domain and that's a little what I really wanted to talk about to you today so for me and This is debatable an ideal application With all the trade-offs that come with this is one that's easy to understand and easy to change That's something that that's what I really focus on when I'm developing or thinking about how to Structure an application is about just mainly these two main things Because I really want for it to be Easy to understand by new team members for instance that that's an important thing so Smaller methods or smaller functions smaller modules. That's usually Helpful easy to change As a trade-off again here because if you have a lot of these small modules then knowing which models are being called and what the The function path is going to look like for a simple process can be hard so trade-offs here a Really thing the thing that's very important to have in mind and a quote that I really like Is this one that the system is the asset? The code is really a liability. So what I mean here is that With all I'm going to be talking about if I was able to have my system and have a product that works and Really with zero lines of code that would be ideal for me and that's kind of Contradictory to the geek within us all right like we like to write code, but on Professional setting that's not really what you're being paid to do most of the times you're being paid to solve a problem Not really write code code is just the way you solve that problem so a way that I like and of Thinking about how to solve these problems is the main driven design. So that's Something that we're gonna talk about now the main driven design, which I'll be calling ddd from now on because it's just shorter is More or less like a theoretical it has some actual patterns and stuff that you're gonna use I'm gonna talk about some of the more Theoretical ideas about the main modeling So you have your problem and then how are you gonna structure your code to be able to Achieve the separation of context and all of that The first thing the thing that I I wanted to stress because again in my experience This is something that most people don't even talk about and don't even think about when building applications Are sub domains sub domains represent something on your problem space and that's the the real difference and Because we're mostly working and thinking about our solution space So how are you gonna solve things and we don't really talk about? The problem space a lot. So here I have an example of two different sub domains, which are sales and support So these are things that exist for our product we have a sales team and sales part of the product and a support part of the product and some of the mains can have Different types. I here have an example of two of them. There are three So first of all, there's our core domain We have to think of what is the main thing that our problem is solving. What is our core competency as a as a company and So that's it's gonna be a part of the product that you really gonna focus on I You have supports of domains So support is something that you're building yourself still it's important to the company But it's not really the core thing you want to do and then you have generics of the mains as I have there for support Which still is something that you need But it's probably something that you can get off the shelf a good example of supporting sub generics of the main Something like a payment system. You can just use stripe or brain tree or the wall or whatever you're using You have a small adapter layer and that just works You can switch them off and as long as it takes a token and an amount to get a payment then that's fine So those are sub domains Now when you move to the solution space in in thinking about these things You come you come to the bounded context bounded context Can have a one-to-one relationship and do have a one-to-one relationship a lot of times of sub domains But they're not necessarily the same thing But here we have our sub domains and we have a different context for each for each of the sub domains And the way it's called context is because really what bounded context are about is Defining a boundary between parts of the system that have different languages that they speak, okay? An example a good analogy I think to think about sub domains versus bounded context and what the different is is if you think of a floor Like you have a room like these you have a floor and you have a carpet Okay, so your sub domain is going to be the floor And you're gonna you want to walk on a on the floor and you you can put a carpet and if it's cut Exactly to the size of the the floor then you have a one-to-one Mapping between the floor and the carpet so that's your sub domain and your bounded context But and to show like how a solution space is different than a problem space You can have a floor and imagine he has some holes in it Now your bounded context can be you can still be the carpet But if I'm walking through a hole I might trip so a better solution might be to fill the hole and then put the carpet on top So continuing the analogy the floor is still the The problem space is still a sub domain But the feeling of the holes plus the carpet is now your solution so there's two things to your solution Okay, so that's why there's these are different things to solving this problem Now going a little bit Deeper into bounded the bounded context the ones we were talking about here sales and support You can see here the different entities that we are using inside of each of these different contexts You have for sales like opportunity Pipeline and support has ticket and defect and some other stuff The the more interesting ones for me are customer and product because you can see them. They are in both so what this means is They have the same name, but they are in different contexts. That's what I'm talking about the language This is a language We call it a ubiquitous language. So that means that the sales team From top to down of the whole organization that that means The domain experts or your sales team developments when they talk about a customer within the sales context Then that's like a sales customer. You might be not even a paying customer yet Something that you're something that you're trying to sell to within the support context. That's probably already a paying customer That has some issue. So they are slightly different and you want to model them as different things And here just making the parallel to umbrella apps a little bit Here's where I would separate each context into a different application okay, so it'll be like a different service and Each model will be represented in each of these applications because they represent different things And now you're not conflating those contexts as I was talking about like in the user model Because user if you think about it is really a bad name Because user can represent so many things it can be an account. It can be a customer. It could be an author There's so many names for what a user can do and that's why they are Often called behavior magnets because if you just say user that's so generic that everything is gonna want to go in there and so thinking about This Thinking about it in this way helps with that especially one very important thing about this that I kind of not really said yet is This is all about communication what I'm talking about here coming up with these names this terminology separating of context This is all about talking with the main experts talking with the stakeholders getting everyone together and having this shared glossary of information and another Benefit of this is then now as I said these applications if you implement them as application can be deployed separately They can be scaled separately. So if we need we have a higher Needs in terms of users for sales. Let's say or for support We can have 10 support servers and servers and just one for sales. They can really they're completely independent That's the whole idea Again to kind of drive this point through If you think about tomatoes Tomatoes like it's a simple thing. You think about it but in Culinary so in cooking a tomato is seen as a vegetable in the botanic world is seen as a fruit in theater or movies It's like feedback like from the rotten tomatoes thing and even a lot of another one If you think of the Pomodoro technique For productivity productivity a Pomodoro is a tomato. That's you're counting units of productivity So just for a simple thing as a tomato we can see four completely different Things that it can mean in different contexts. So that's kind of the idea of what bounded context mean is thinking about where the same concepts or different concepts but The the the ones that have the same name are the more interesting ones what they slightly differences they have when talking about it in different contexts and the The reason it's important to think about this context and separate them is That having a domain model that models everything is pretty much impossible So that's why you want to break break it into different contexts and have the separation again, because I know this thinking about this if you never Seen a domain model this way. It's it's not easy. At least it wasn't for me at first So I want to give another example We're having we have sales and now we have shipping instead of support and we added our course of domain Which is manufacturing and here we see an example of manufacturing has a manufacturing context That's a one-to-one shipping has a shipping context. That's a one-to-one But sales has two contexts Okay, we have sale the sales context with if you think about it as an application That's an application on our side that we implemented ourselves But then we have an external context with a CRM that the sales team uses. So that's something that we want to represent here and It's part of the sales context like on the CRM the terminology that we use is going to be the terminal Terminology that we use within the sales context So for instance a customer or a product is going to represent the exact same thing that we're talking about in our sales context, okay? Now the opposite of this is if you think of an app in the Straight for I'm going to call it straightforward MVC where you have models views and controllers and everything needs to fit into one of these buckets Then what you really have so the problem doesn't really change you still have the same set of domains Like the problem is the same, but your solution is different. You now just have one app. That's one big context So everything like you have a customer Everything is going to go into that customer or you start adding prefixes like sales customer or support customer or stuff like that But everything is within the these app context So you you have your solution space is now covering or going over all of the the difference of the mains within the problem space and This is really something that I've definitely done a lot in the apps that I've built and Once you start growing your app this is where all the problems I think come from or a lot of them actually and The god models that I was talking about the behavior magnets. That's I think this is a big culprit of that and Of course all of that will eventually Slow the pace of your of your team because everything is in the same context now You're trying to the main to model your entire domain into the same thing and and it's not always easy okay, so that was about it for so the mains and bounded context and The last concept that I want to talk about in terms of the DDD theory is the concept of aggregates So we're now inside of a bounded context This is the example of the sales bounded context and we have these different entities which are the boxes And we have this almost circles which are the aggregates A lot of the aggregates can just have one entity. They're not super interesting But an aggregate can have more than one entity and what that that means is That if you have if you have an aggregate with let's say these two entities customer and address It should really be treated as a whole thing. So that's the point of the aggregates It's it's one thing and it serves as a way to uphold The main invariance for instance you have this business rule that there cannot be more than one customer per address the way that's going to be handled is There's gonna be an aggregate route That's the the customer here. That's the aggregate route That's where the outside of the aggregate communicates to it all all the calls come through the aggregate route and it's its job to know the its internal state and manage That internal state and uphold that domain invariant. So it's a consistency and transactional boundary for the rest of the system You can you can think of it for the rest of the system There's only like the customer, but internally the customer has a separate thing. That's an address So this is an aggregate. That's an aggregate route. Usually We name the aggregate after the aggregate aggregate route. So in this case would call this the customer aggregate And now again the parallel to umbrella apps or in elixir I Said bounded context we are usually do that with different apps Different aggregates are usually mapped very well to different actors. So different processes It could be very well that this is a gen server if you use that so a generic server that holds its own state and The way then the outside world and talks to it is as we've seen in the other talks You have a process ID you send messages to that and then he has its internal state and managers all of this So it maps really well to the to this actor model Okay, at this point some of you might be thinking This is Duff we call so it is a lot of big design up front We need to think about all of these things and it's not I want to really stress that The idea is not to achieve the perfect the main modeling because that's not gonna happen The idea is think about this a little bit communicate within the team Reach the main model that didn't command query responsibility segregation. Sorry what this means is First before CQRS we had CQS which stands for command query separation principle and it's actually a simple but powerful principle it states that This is for a function or a method or whatever you want to call it if you have a return value You cannot mutate state and I'm gonna change this a little bit for languages like elixir or Ruby Which always have a return value. You cannot really return void So if you have a return value you care about you cannot mutate state But if you mutate state then you cannot care about the return type So the idea is you have commands that mutate state Somehow you can be an internal state doesn't matter if or create a new state in case of a elixir or any language they use as a immutable types or and So that's commands and then you have queries that Where you just do a query and you get a return value back, but the query cannot change anything on the state So that's CQS the difference here is that CQS This is exactly just what it says so you can have a class or a module that has these commands and queries all together CQRS takes CQS and adds an extra layer that says that each Responsibility so commands and queries need to be on separate models. These need to be separate classes or modules So what this gives you is something like this Where you have a command model that you can send commands to it will for instance persist data to the database And you have a query model you do queries on In this example that I have here. They're both on the same application, but that's not even necessarily true they can be in different applications and That will give you some powerful things to work on The idea behind CQRS is that it's it's not possible to create an optional optimal solution for every situation Using just a single model This this thing builds then on top of the next thing I want to or the next thing builds on top of this And what I want to talk about now again very very briefly is event sourcing. I didn't know if you guys heard about it, but Event sourcing is very coupled with CQRS. They both are very evangelized by Greg Young Which is the the guy that came up with the terms event sourcing and Now we're gonna put all of these I've been talking about you're gonna put it together so we're gonna now look at CQRS with DDD and It kind of comes into event sourcing the idea is that you have your bounded context It's a green box here You got a command that command will go to an aggregate root and the aggregate root knows knows how to translate a Command into an event. So event sourcing it works all with events. That's just That's what why the name is event sourcing Takes a command transforms that into an event or events can be more than one and persists the event into an event store The event story can be a data relational database. It could be something else. It doesn't really matter and the other thing the aggregate root does is Manages its own internal state and publishes the event Somehow again have their message buzz doesn't really matter how this is not important for event sourcing how this happens But you will broadcast the message the event to every Listener that it has subscribed to to that particular event then and So this is the command model then you have your read model over there That gets the queries and this is listening to the events that that are coming depending can listen to One or other event depending on what he cares about Reads the event and persists the data that he gets from the event It can massage that data a little bit however you want and persists that again I have a relational database, but it can be in memory. It doesn't really matter The point here and the thing that that's very powerful because these are separate things So this does not do not have to be the same database they don't even have to be on the same machine and So what means is that you get these events with all the data that you can use and you can then construct the For instance, let's assume that's a relational database. You can construct your tables the exact way you need them for your reads so Potentially that means you can just get rid of joints all together You can just have a table or a database view Materialized view like whatever your solution is, but it can be optimized for the exact situation You you want for the queries in this case the in the case of event sourcing this read model is called the projection And the cool thing about it as it's have one here in this example But for the same events I can have any number of different projections So I can have one optimized for reporting one optimized for logging one optimized for analytics I can have these different things. They can scale differently. They can because this is all independent. There's no coupling between these things so it's a Simple I think model, but a very powerful one and You see this is all coming together in terms of a ddd separation of concerns and all this Okay, so that's it with theory I'm not gonna bore you anymore with here. You're gonna look at some code of how to Actually implement this into elixir with umbrella apps and I give you an example of that The library I'm gonna be using for my examples is called commanded You can totally roll your own event sourcing system in elixir. There's other solutions other than commanded I've been using commanded and I really like it So if you want to try out CQRS and event sourcing in elixir, I really recommend this library. It's pretty cool So here's what we're gonna be building basically We have going back to our same example that we're using we have our sales context and our shipping context They're very similar here. So we have at the very beginning Not really a command, but we have our public API. That's hiding the dispatching of the command Just to make it simpler for the users. We have on our sales module a place order That's a function. It takes a map with the attributes needed to place an order That goes to the sale context as a command then you see that place order That's the command it goes to a router and the router is the place that knows Where to which aggregate route to send each of the commands? So we know that place order will go to the order aggregate route for instance And then the other aggregate route knows to translate the place order command into the order placed event So that's what the aggregate route is doing changes its internal state and then Sends that event to all the event handlers that are listening I Have here in this example two event handlers one inside of the bounded context and one outside Just to represent that it doesn't really matter what it is on your system As long as the events are getting there the event handlers should work because Basically, you can have any sort of queuing system in in here and to send the events and it should be very Distributable One thing to have in mind here is when doing something like this you should mostly be okay with having an eventual consistent system because There even with commanded there's you can Require strong consistency for some events, but it's not really great If you can go with an eventual consistency Which means that you just send the events you hope someone will catch them and that will eventually catch up on the query models on the read models And for shipping is the same thing the examples I have are actually just for sales because this is really the the same thing, but the shipping has just a different command It's cheap order and there's I just have both because there's a particularity that I want to talk about Between integrating this just to context Okay, so looking at the code Here's the main sales module For this is a elixir code if you're not familiar familiar. I hope it's simple enough that you can read it There's a function called place order takes all the properties that we need to place an order and then You have the place order Command that's a struct That hasn't been talked yet here, but as a struct is just like a value object you create this map with this It's basically a map with properties, but has a name So that's a place order with all the properties and then we use the pipe that Sorry, Peter talked about that Takes the the place order the command sends it as an argument to the router dispatch and that will send it to the router The one thing to have in mind here because I'll talk about it in just a second is that we're generating a uuid here And we're sending the uuid as part of the command So looking at the router is very simple. It's a using Commanded commanded behavior for the router That's why this creates this kind of a DSL for the router But it and abstracts a lot of what the router is doing So that's a reason to use libraries, so you don't have to really do this yourself if you don't want to And you can see that this patch takes the Narray with our list with all the commands. He wants to map to a certain aggregate route And in this case you just have one place order that goes to order the important thing here is this identity part It's really important important. What we're saying here is that this Entity so this order is gonna be represented or what's gonna? Identify this order is that attribute is the uid uuid the one we just generated before And this is important particularly to communicate between contexts So what we're saying is that there's always gonna be uuid on the order that's gonna uniquely identify it So that when there's a projection that's gonna get an event on some other context It will know that it we're talking about the same order because of that uuid So They now can talk together and say like now we have place order But we can have now ship order and we send the uuid and we're talking about the same thing importantly and Might be wondering about this is We what this means is that we no longer have or we can no longer really rely on database Enforced IDs, okay, we have to manage on the application level our own IDs Because as I said we can be using totally different databases or a system might not be using a database at all So we cannot rely on the database to give us IDs And what that also means is we kind of cannot really rely on foreign key constraints as well We have to manage that on the application level So that's a cost we are at a trade-off that we are willing to make in order to have this Very distributable and scalable system Okay, the router just to recap the router takes the command It knows to send that command to the to the ordered aggregate route the aggregate route is Here again, it's a struct and It does two things in commanded these are this is a bit particular to command it the concept is not but the names are so we have execute Execute is where we take the command and we translate that to an event or events You can see that the execute Function takes two arguments. The first one is the current internal state of the aggregate which is an order and We can do stuff with it and then it takes the command and it returns an event Here we're Importantly pattern matching on the current state to make sure that the UID of the current state is nil Or no nil is the null for elixir And what why this matters is we can only place an order for an order if an order does not exist yet So this means is that there's gonna be a different struct a different instance If you want to call it of this entity order for every different order and that's gonna base gonna be based on the UID Okay, so that's execute and then we have apply apply is the how we tell it how to apply This event to the internal state So again, we take the internal state as the first argument and then we take the event as a second argument and then we tell it how to apply the the state like the event or whatever information we want from the event to the state and here if you're not familiar is just a Syntax from elixir to update Basically a map so it's we have the state you can think of as a key value map and we want to update certain keys of that map Okay, so this will then We don't see it here because it's handled by commandant, but it will broadcast the event and Then you have some event handler which in this case is a projection so it is gonna represent our query model our queries or our read model and this handler has You can have more but in this case has one handle Function and the handle function will pattern match on the events So any event that does not match despite pattern matching or any other that we have on our handle Handle functions will just be disregarded by this event handler. So here. We're saying we're interested in Order the order placed Event as some meta information. We don't care about I abstracted this persist order. This is just implementation details of starting that the event into Relational database so nothing too fancy there and then return the okay atom to say okay We process the event correctly. We could also return an error and say like we could not process the event for some reason Again, we are using the commandant behaviors for the handler and the interesting thing there like he has a name that's not super interesting, but you have that start from origin and The reason that's there and there's you can start from other things is that In these examples the way I showed it you create or instantiate This is a projection as soon like as soon as you have the first the system the first time So every event will be broadcasted and come here at the time But that's not necessarily true for every situation You can have the system running for a while and then creating a new projection. So what do you do there in? In this scenario what I'm doing is say okay start from the origin of all the events and Send them over so it's gonna go through the list of events because that's event sourcing I didn't really Say this but that event store is basically you can think about it as an append only List of the events so it will go through all the events and we'll replay them and we'll do the handle thing For all the events and then we'll eventually Hopefully catch up and then it will start working from there okay, so This is how you then have your your projection with Here I'm doing persist order to persist to the database, but you can very well persist to the database and also persist to a server in memory and You can have at the same time a database persistence and a caching layer all built based on these events that that come That's pretty easy to do and something that you can very well do Okay in conclusion Building maintainable apps that scale is not easy. That's a premise Or an assumption I'm making But that being said I think that the from and I I've been doing rails for the past five years now So straightforward MVC is basically what I do, but I think it is flawed And I even for prototypes I think because postponing any sort of a conversation between the main experts and the dev team or design team or whoever's involved It is it's not very good You need to start talking about what you're gonna build and what how are you gonna call things? As soon as possible if not what usually happens you leave you leave that to the developers to come up with Random names a lot of times because we don't have to be experts in all the domains that we are coding for And again communication with the main experts keeps your abstractions in check and in general makes it for better apps I think So the last thing I want to say is I want to give you some homework for after the conference is Think about the app you're currently working on whatever it is and try to draw a diagram of the subdomains and the bounded Context you currently have in your app and see how those matches all those match and then think If any of these techniques I just told you about any of these even if not the event sourcing implementations Just the domain modeling if it could help into separating and some concept We could do some of these concepts and contexts are even coming up with concepts that you didn't even know that we're there As a bonus you can try implementing this with umbrella apps and commanded and let me know how that goes if you do it That's it. I'm Zemeth pretty much everywhere online if you want to subscribe to my Soon-to-be newsletter it doesn't exist yet. You can go there I want to just thank my company paying for me to be here and allow me to be here and that's about it I think because of all the issues I took all the time So I'm gonna be here for the next two days. If you have any questions on this, let me know I'm very happy to talk to you about this So thanks. We have a break now


So, this is lecture 36 and the last thing we saw was couple of ideas hopefully you remember the fractionally spaced equalizers and pass band equalizers. So, those while being similar in the ideal case while being similar to what is being achieved, similar to the previous constraints that previous structures that we saw like symbol rate equalization and even base band equalization. In practice there might be a lot of advantages to these two things because of various other reasons. So, these two things are used in several systems. So, now I am going to briefly talk about a complete PAM receiver. So, one version of a complete PAM receiver remember when I say receivers have if you actually see implementations of receivers are all various choices that you can make for different components and all possibilities exist. So, what I am going to draw is one version of it which is which one can say is a little bit canonical as in many things you will find similar structures repeated. So, let me see I mean it is a bit of a complicated picture. So, I will try to recreate it as clearly as possible. So, you have input coming in which is a band pass signal. So, maybe I will call it r of t or something. So, the first thing that is typically done is a usually a band pass filter. So, you have a certain band in which you are expecting a signal and since other bands might not carry all kinds of other signals you do not want to pick up any of those things. So, first thing that is typically always done is a band pass filter in the range of interest. So, after that what do you do after band pass filtering you will have to do the phase splitting and then move it to the base band multiplied by e power minus j. So, the phase splitting is basically is removing all the negative frequencies and keeping only the positive frequency it is a phase filter. So, you have to do one crazy filtering. So, that filter sometimes it is done in discrete time also. So, depending on the frequencies of your system depending on what is possible and not possible you might be able to even do that in discrete time. So, in general the band pass filter might have a sampling following it. So, this sampling will have to be maybe at a very high frequency if you want to do it properly, but maybe there are cases where you can play around with the sampling also. So, in general there might be sampling here, but that is optional. So, I will put a little bit of a dotted line around this. So, if you want to do the phase splitting in digital then you will have to do a sampling. So, but sometimes it is done in analog itself. So, you have a phase splitter. So, after that you have complex signals. So, till you have up to the phase splitter signal is real obviously and after that you have complex signals. What do you mean by complex signals? You have to pull two wires out. So, two wires matter to you not just one wire. It is two signals matter to you after that. So, the first thing you do is multiply this by e power minus j 2 pi fct. So, that is the first thing you do. So, you move it to baseband. Then after that you are going to start your filtering. So, you have to do match filtering in your baseband equivalent followed by symbol rate sampling ideally if you want to do that then followed by the whitener I mean precursor then a post-cursor. So, I will assume an MMSC DFE like structure. So, you have a precursor and a post-cursor. So, of course you can do it to be or something more complicated, but in general that is not very practical. If you have a lot of tabs that is not very practical. So, I will assume an MMSC DFE type equalizer and then typically one can also do it in the fractionally sampled domain. So, twice the symbol rate sampling you might want to do. So, here you have a sampler which is I will say k Ts kT by 2. So, twice the symbol rate you are sampling out of the from the signal and then this goes to the fractionally spaced equalizer. Remember the FSC is supposed to do both match filtering and the whitening. So, it is one filter and that is always nice to design. So, you have to adapt or do anything it is just one filter. The tabs are adopted in one way there is no further confusion. After the fractionally spaced equalizer you move to symbol rate. You sample at single rate so remember I am going to do so well. So, first thing I should be careful about is the FC. So, I may not have FC exactly at the receiver. So, I will say normally I have F1T and whatever delta FT that comes in I am going to take care of inside the equalizer in the passband equalizer. So, I am going to do both FSC as well as passband equalizers. So, I have to multiply here by some carrier and remember that delta F if you know it you can use it, but delta F has to be derived from the decision. So, I will not show you where it comes from I will show that later. Similarly, these sampling instances this one, this one and this one all have to come from some recovery something further down in the circuit. So, eventually we will connect it up but for now assume it is available. So, you multiply by a e power minus j delta FT. Then after that you have the addition from the post cursor this goes to the slicer this is your slicer. So, the slicer output on the one hand is your decision this is your s hat k but the output is also used for several things. So, one of the first things that is used for is it is used to compute the error for updating your equalizer. So, I am going to try and draw this as cleanly as possible, but it is a bit of a difficult picture to draw. So, the error slicer error is used first of all to update your equalizer, but it has to be again rotated for the delta F. In the pass band equalizer case the error once again is rotated before it can be given. So, to the precursor of course the post cursor works with whatever error is already there. So, remember that. So, what is the post cursor? So, it goes to the post cursor as it is for adapting the post cursor. The post cursor also works with the output of the slicer and gets it back into is it okay? So, make sure the picture is clear in your mind here I have a multiplication from the carrier then after that goes to the fractionally spaced equalizer for update. So, what? Now, the input and output of the slicer should also be available to two blocks, two blocks that I am going to call the first one as the carrier recovery block sits here and then you have a timing recovery block which sits here. So, let me see I think the carrier recovery block has moved a little bit to the right. So, the input and output of the slicer are going to go to the, it is not enough room is there. Anyway, so let me see let me take it a little bit twisted sorry about that for the timing recovery block and to the carrier recovery block. So, there might be other parts of your circuitry which are also connected to the carrier recovery and timing recovery which I am not going to show if I start showing all of that then it will go for a major toss. So, I will just say the slicer input and output are connected to the timing recovery carrier recovery I think it is pretty much enough but in some cases you might want in some special way other things to connect also it might connect you can use something else if you want for carrier recovery something else if you want for timing recovery in this case I am going to only do timing recovery and carrier recovery based on decisions around the slicer. So, that is why I am showing only those two inputs you might want other inputs also and if you want you can take them but I am not showing all that here. So, the carrier recovery gives you the carrier that you need to multiply here and the same guy is taken out here and multiplied with this oops okay so maybe I will move this and roll it okay. So, that is the one loop and the timing recovery like I said it produces three different timing pulses and they are used for the various samplings in your circuit okay. So, like I said the receiver involves a lot of messy calculations and to faithfully represent that this diagram is also equally messy okay. So, there is this version of this picture and well there is an exact same picture in Barry's book okay in John Barry's book. So, you are welcome to look at it if you want a better idea okay. So, so what okay so the various things to note first of all the first thing to note is there are a lot of loops okay. So, previously we never showed any loops in the receiver okay but you see there are a lot of loops one of the first loops is and all of the loops involve the slicer input and output the first loop is the equalizer update loop okay. So, there is a loop that way okay and the other loop is the timing recovery loop this is very critical it goes through a lot of things. The next loop is the carrier recovery loop okay. So, there are three different loops and all of them have to function properly within specified parameters to for the whole receiver to work if any of them fails the whole thing will go for a toss okay. So, that is where the the artistic input in the receiver comes in okay. So, how do you adjust all these loops carefully how do you pick the parameters what do you pick for each of these things because what goes inside carrier and timing recovery is usually something non-linear something heuristic so usually there will be these PLLs and all these things in order okay. So, once you have face lock loops and all that things get a little bit dicey so how you design them how nicely you do them is important but all of that can be done even digital you do not have to worry about analog PLLs but still a lot of careful things that need to be done okay. So, one thing I want to point out is the if you look at the carrier recovery loop right okay. So, if you look at the carrier recovery loop okay the output of the slicer goes output and input of the slicer go to the carrier recovery loop then it comes in feeds us a multiplication okay and then it goes back to the slicer okay. So, in the carrier recovery loop there is no filtering okay of course you can say there is the post cursor but the post cursor does not play any role in the carrier I mean does not play a significant role at least in the carrier recovery loop okay. So, within that loop there is no filtering okay. So, that happened because why did that happen that happened because the way we are doing the multiplication we were able to pull it out nicely okay. So, the other structure helped you in doing that if you were to do the multiplication on the inside around the slicer all kinds of crazy multiplications will happen and then maybe the post cursor will also play a role okay. So, right now the post cursor is not playing a role because a multiplication happens in a outside of it completely okay. So, it turns out that is nice for carrier recovery right. So, you do not want when you have loops like that you do not want to put filters and play around with the carrier in any other way okay. So, subtle things like that become crucial in a receiver design and you do not want to put too many things in your loops how do you reduce it etc etc okay. So, all those things I will not go into any more detail because not much time on this course but we will see a few things few of these blocks closely and look at some maybe alternative ways of implementing them and make some comments okay. Any questions just by looking at this picture yes it could have. So, in this version I am just doing purely decision directed carrier recovery okay. So, remember C1 after the fsc everything is symbol rate okay symbol rate twice symbol rate okay well fsc works a twice symbol rate everything is symbol rate. So, when I say something is multiplying the carrier do not imagine it is some sine wave or something which is multiplying it is only a complex number every symbol gets multiplied by a complex number okay. So, it is just one rotation e power minus j delta f k t you are trying to estimate that but it is only one complex number on the unit circle okay. So, how you estimate that is can change symbol to symbol and you can completely control that with decision directed itself. For instance if slicer input if you notice it is at some point is at some point right the previous slicer input would have been at some other point the slicer output would have been something. So, based on that you figure out approximately where the rotation is then make do that some such thing I am talking about when I draw something like this. But you could for instance taken the the band pass signal okay from the band pass signal you might be able to recover the carrier there are ways of doing that okay. So, if you do that then it is a different kind of carrier recovery problem okay. So, maybe we will talk about that later because right now I am just doing purely decision directed carrier recovery and decision directed timing recovery nothing nothing more than that okay. So, the pros cursor and the fsc are adapted according to the LMS algorithm if there is a training phase then you will have another block which holds the training data symbols which will be used for the error computation for the adaptation period and then you have decision directed period when the actual slicer output is used okay. So, in the training phase you can even for the carrier recovery timing recovery you can use the training symbols which you know exactly you do not have to use the slicer output get confused with that. Anything else any other question you know fine okay all right. So, let me make a few more comments now. So, okay so what I am going to try to do is to draw the spectrum and maybe even the signal only the spectrum I think only the spectrum at different points as we go along in this receiver okay. So, when you are actually building this stuff that is what will help you okay. So, when you are trying to debug when something is not working all the theory you learned will not really help you have to look at actually the signal that you see before the band pass filter after the band pass filter after before the phase split after the phase split do you do you see what you expect to see okay. So, you should know what to expect first and then you should know how to see it okay. If you do know both then you can quickly debug what is wrong in your receiver otherwise you can never do it okay. You will only keep staring at the final data and say I am having 50 percent error rate 75 percent error rate some crazy numbers like that does the 75 percent bit error rate make sense all right. So, just flip everything you will get only a 25 percent error rate okay. So, 50 percent error rate 50 percent error rate is the only thing you can start you have to know what to expect at each point in your receiver and actually see it see it in a real system or assimilated in a MATLAB based system and then see what what you expect and then debug what is going wrong okay. So, maybe we will see that more elaborately later but for now I just want to show the spectrum at various points and make a few comments about alternative ways of smartly implementing these things okay. So, the first thing is that the input okay before the band pass filter what is the spectrum like okay. So, it is very easy to see that. So, you have a center frequency and the spectrum will be something around that okay. So, it may not be symmetric about FC right. So, that is your spectrum at the input okay. So, now of course there are two choices like I said you can sample at Nyquist rate this whole thing and then run a digital phase splitter if you want okay or you can do analog phase splitting. So, you do a phase splitting after the phase splitter what will be the spectrum. So, only the positive part right the negative part is gone you only have the positive part okay and then you do a multiplication by e power minus j 2 pi f 1 k t okay in the digital case and in the analog case it is 2 pi f t f 1 t okay. So, usually so let us assume it is digital or analog one of those things and then you multiply okay but there FC and f 1 need not be exact okay. So, maybe this is f 1 this is f c okay. So, there will be a small offset between the two of them okay and so you might want to multiply okay. So, you do a preliminary demodulation and you get your thing down to this is f 1 and now there will be a bit of a weird thing about that okay. So, this is what you get after a multiplication by e power minus j 2 pi f 1 t you can call this the preliminary demodulation that is the rest of the demodulation happen inside your equalizer okay. So, you are doing pass band equalizer inside the equalizer you are doing the rest of the demodulation in a decision directed way okay. So, that is the way of thinking about it okay. So, there is another way of getting from here to here without doing multiplication by e power minus j 2 pi f 1 t can anybody suggest smart way of getting there have you come across this something called band pass sampling have you heard about it okay. So, suppose you pick of a sampling frequency which divides f 1 okay.  So, I am getting totally confused here.  So, it divides f 1 and then it is long enough so that f s by 2 is going to include my entire band of interest. So, now if I sample at f s what will happen the aliasing will automatically bring it to base band and then I do a low pass filter to get rid of whatever else that might have been picked up okay. So, it is a very simple way of making sure you get this signal down to base band instead of multiplying by e power minus u. So, this is a common trick it is very nicely done but and if I f s and if I f c is not an integral multiple of f s or something you will always get this delta f you might be able to avoid the delta f by carefully designing it even otherwise you can do it okay.  So, what happens to the e power term it is completely drops out it is only becomes 1 okay. So, basically the envelope of the complex base band signal is going to be the complex pass band signal is going to be a base band signal and there are points in that complex pass band signal where your base band signal gets exactly reproduced. So, you simply sample there and you get your base band signal okay. So, there is no problem there okay and it is enough if you sample at the base band okay. So, that is the idea here. So, that is one more way of getting to doing the preliminary demodulation okay. So, you pick your clever sampling frequency so that you get you need a little bit of a gap also because after that you want to filter it down in case something aliased filters in okay. So, you want to filter it down and you want a gap so you have to pick the f s smartly so that it works okay and it is possible since these numbers are always there it is possible okay. So, that is one more way of doing it it is a smart way of doing things it happens. So, now you have complex base band okay and then you can bring in all the theory you want okay. So, you do you want to do symbol so you want to do white and match filtering followed by Viterbi decoding for optimal detection but nobody is going to do that in practice because once the number of tabs becomes 6 or 7 or 8 you cannot do Viterbi okay. So, the best structure next is the MMS EDFE and that is always done and in practice you want to do also fractionally spaced equalization and adjust for the delta f inside your equalizer by doing career decision directed career recovery okay. So, that is the way in which the whole thing works okay. So, let me just quickly summarize all those things that happened here. So, instead of doing the optimal thing so we pick the MMS EDFE with a fractionally spaced implementation okay a fractionally spaced MMS EDFE that is what we are doing. So, it is got two filters the first filter is a precursor but the precursor does what? Both match filtering and the equalization precursor and then the post precursor which works at symbol rate okay this is twice symbol rate this is this works at symbol rate okay and you want to do that all right and the next next crucial role is played is played by the slicer error okay it is going to give you all the loops that you want the first loop it gives you is equalizer adapting loop okay you have to set up a proper LMS or some such algorithm carefully and in the fractionally spaced equalizer case every second output only can be adapted for the precursor post cursor you adapt adapted single signal rate another loop it drives is the career recovery loop remember this is a symbol rate career recovery loop okay. So, you are only doing you are just finding different complex numbers different rotations different values on the unit circle to rotate by okay. So, that is what you are finding that is that is the way I drew it you could also have like he was pointing out could also take a band pass signal a version of the band pass signal and feed it to your career recovery to help it okay it is possible I will describe that briefly you will see why it is possible see BPSK what are you doing for instance in BPSK modulation you are sending either cos 2 pi fct or minus cos 2 pi fct. So, if you square it what will happen you will get cos a frequency a pure frequency at 2 fc right and then you divide by 2 dividing by 2 is quite okay. So, you do that you get fc that is one more way of doing career recovery there is various ways of doing career recovery. So, if you do that then there will be other components here you can do it in various ways okay this career recovery loop and then you have a timing recovery loop okay. So, it produces three different timing pulses okay one at symbol rate one at twice symbol rate and one which which if necessary if you are doing Nyquist rate but also that will also be some multiple of this okay. So, you never want to produce clocks which are not multiples of each of them right. So, usually you never do that in boards okay. So, this is what this is what it drives okay. So, so those are the various components of a receiver and for all you see receiver boards they might be floating around you might be able to get it I think a couple of places where you suggest if you are interested one is the telematics lab downstairs but they have a satellite receiver board okay. So, you can go there and you can see all these components and figure out what chips they are using what is the what is the coolest PLL chip out there for doing timing recovery etc etc etc. So, these things keep changing with all these chip makers keep changing their chips once in a while. So, what chips to use and all you can see and also another place is IWL Intel Wireless Lab where I think I think there is some there are some wireless receiver boards might be able to see some extra components okay. So, you can see that if you want. All right. So, what we are going to do next I know I had a big list for you but what we are going to do next is a bit of slowing down okay. So, the first thing I want to do is I want to go back and look at simple BPSK and draw basically signal diagrams okay. So, what does the signal look like at different points for simple BPSK okay. So, I think people who do the lab already know this because they have actually seen the signals but anyway I think everybody should see them because you should know how the signal actually looks right. I never did that carefully enough before. So, we should just I think I am going to do that for BPSK and maybe for QPSK and then with with different types of pulse shapes initially with rectangular pulse shape and then with raised cosine pulse shapes. So, just to get to see what the signals look like then you can play around with it okay. So, this is mostly review just to make sure you do not forget the very basics which are very important okay. So, the first thing I am going to review is BPSK with rectangular pulse shape and ideal channel this is the easiest okay.  The reason why I am drawing like this is if you want to do QPSK what will you do? You will have one more line which takes the imaginary part okay. So, well think about it okay so roughly something like that you would do okay you have x2 of t then this goes through a channel which I am saying is ideal okay this is an ideal channel so it is basically delta of t okay. So, do not worry about the channel too much you get a received vector to which I am going to add noise at the receiver of course anything you do will add noise and then you get the actual received vector which you have to deal with yes it is okay yeah it is true the real part and imaginary part will come before I know the receiver you would do something else x1 of t is going to be the signal here okay so what I want you to do is I am going to say s of k is something like this it is at 0 it is plus 1 at t it is minus 1 at 2t it is minus 1 and 3t it is plus 1 okay so I want you to draw what x1 of t will be what x2 of t will be what r1 of t will be and what r2 of t will be roughly okay this is a transmitter okay x1 of t is the easiest it is going to be 1 between 0 and t minus 1 from t and 3t am I right then 1 again from 3t to 4t okay that is x1 of t what do you do for x2 of t so it is basically x1 of t multiplied by what cos 2 pi fct so you need some information about the relationship between fc and t so I am going to say let us say for a simple case four cycles of the carrier will show up in each symbol okay so suppose you assume that plot the plot x2 of t so you can take that 4 to be any other number also of course take 3 if you like but in practice it will be much larger you know you expect it to be very very large x2 of t okay so I am taking cos 2 pi fc and I said four cycles maybe three cycles we will see one two okay so I am able to fit in only three cycles very nicely so I will take three cycles okay so that is how the first thing will look what will happen next there will be a discontinuity right there will be a sharp discontinuity here it will go down to minus 1 there will be a 180 degree phase shift okay so once again one two three but there will be no phase discontinuity at 2t because the same symbol is going through one three okay I am drawing it with different frequencies there's no frequency modulation going on here okay so it's the same frequency nothing changes okay then once again there will be a abrupt phase shift of 180 here okay one two three then it'll come down to zero and stop this is what you expect x2 of t to be okay suppose I give you only x2 of t how do you identify the symbols okay just by looking at it yeah so you have to look at places where phase change happened okay so you also know given you know t you know exactly where to look suppose you don't know capital t suppose you don't know zero okay suppose you don't know zero when will you not know zero you don't know right at the receiver you're receiving whole bunch of things you don't know where zero is okay and you won't even know capital t suppose you don't know both of those can you still identify where what the bits are and where they occurred roughly okay suppose roughly if you have to do how will you find t for instance okay so assuming there are enough transitions in your data which will happen if your data is random you can look for points of where there is 180 degree phase shift and then roughly see what the time difference is between 180 degree phase shifts and then do what look at the gcd or something rough gcd of those numbers to get your capital t a rough estimate of capital t so then based on that you can figure out whether or not a phase change happened and and did not happen the only thing you can't figure out is the first phase you won't know whether it was plus or minus right I conveniently picked the zero phase here but you don't know what phase it started right you can never know that so only thing you can't fix is the initial bit after that everything else you can fix okay so this this is very important in practice when you're debugging your receiver right you should know if your input signal is okay or not okay I should check if the 180 degree transitions happen okay if it is qpsk what will happen let me see who gives me the answer qpsk what will be this these signals shifted by 90 degrees yeah the phase change will be multiples of 90 degrees it could be zero could be 90 degrees it could be 180 degrees it could be 270 degrees so but still there will be phase changes so you just look for places where the phase is changing and doing that okay but all those things are obviously not optimal receiver practices right that's just for debugging your receiver circuit what's the optimal receiver circuit first thing is who was a band pass filtering followed by phase phase splitting followed by a preliminary demodulator and then a match filter those that's the way that's the way you do actual reception okay so you can just look at it and kind of eyeball the base base band band pass signal and figure out if it's okay or not that's okay to do but don't use that as your receiver principle okay so it's just an approximate thing we are doing this okay so let me show you how the receiver would look and then try to plot well the other things I have not plotted are r1 of t what will r1 of t look like if you say channel is ideal it will roughly look similar okay so in most cases if you're using very little bandwidth like we are doing here right for this for this assumption we'll use very little bandwidth right channel will be roughly flat most most channels will be flat and you'll not see any much distortion here and if your noise is small enough r2 of t will also look roughly like this so this is a good way of debugging if your transmitter is working correctly or not just look at this signal how will you capture such a signal in a scope can you capture it is it possible what will happen what do you expect okay so think about it might be possible okay anyway so that's those are questions to uh what are you about so let's see so you have r2 of t coming into your receiver you do a band pass filter that's fine followed by well you have to do a phase splitter also right so band pass filter and a phase splitter okay so I'll write ps here okay phase splitter and then you do a preliminary demodulation e power minus j so I want to be a little bit accurate here so I'll write f1t 2 pi f1t plus theta minus theta okay so minus theta is just for convenience plus or minus theta some theta okay okay the reason why I'm writing that is I don't know if my the frequency of demodulation is equal to fc and you and you can never be sure about the phase right it's very tough to lock all these things very correctly so initially when I do it there might be a phase problem also you might be able to lock it either here or later on in the circuit that's okay but you may not be able to lock exactly okay so then you do what here you have to take real part again okay so here you might take the imaginary part and feed it to your q channel kind of thing is that okay or maybe some some such thing you'll have to do to get the q channel okay so maybe maybe you demodulate differently for the q channel as well okay so you take real part at least in bpsk you simply take real part right there's no problem simply take real part you get your you get your signal okay so so so so I'm going to call this guy as r3 of t okay after this what do I do I have to do match filtering right now I have the complex baseband signal I have to do match filtering okay so in this case the match filtering is what rectangular pulse is what is match filtering same okay so you have to basically integrate and dumb right so that's what you have to do that's what you do so you do integration from 0 to t and then you do a sample okay so once again there's a kt plus tau because there'll be some delay because of all these things you won't you will never know where it is so that's your filter like I said r2 of t is roughly the same as x2 of t there'll be some noise so I want you to try and plot r3 of t okay so that's where the trick comes assume f1 is close to fc but not necessarily equal to fc and theta is not necessarily zero it could be something else and try to compute what r3 of t will be and then try to plot it okay so first try to write an expression for r3 of t in terms of say x1 of t okay try to compute an expression for r3 of t in terms of x1 of t which is your transmitted complex baseband signal well it's actually real baseband signal but complex baseband signal try to compute r3 of t like that okay everything going well r3 of t should agree with x1 of t do you see that right it should agree exactly with x1 of t that's your that's your complex baseband signal you've recovered your complex baseband signal now before the up converter go back and see that before the up converter you had x1 of t so x1 of t should have come back as exactly r3 of t ideally okay but assuming a delta f and a theta try to derive an expression for r3 of t in terms of x1 of t roughly okay and then of course there'll be a plus noise we don't care about the noise just the signal component of it what does it work out zoom channel is ideal okay so we're quickly running out of time so what does it work out to x1 of t times cos 2 pi 2 pi delta f t plus theta plus some noise okay so I'll call it simply n prime of t I don't care about it okay that's some noise okay so this is your signal you expected x1 of t you're getting cos 2 pi delta f t plus theta okay if delta f is 0 theta is 0 or you know theta roughly so it's it's exactly x1 of t there's no problem but if you don't know theta and if you don't know delta it can be a different signal okay so one way to just try and get a feel for it is to try and plot x1 of t or r3 of t assuming a different delta f a delta f not equal to 0 okay so nominally you expect x1 of t to be like something like this right roughly you expect this for x1 of t okay what will happen when you multiply by cos 2 pi f ct delta f delta f t plus theta okay so it depends on what delta f is suppose I say delta f is really small okay it's going to be very small so in fact even this is a very small frequency right the symbol rate is very very small so it might actually show up significantly in this even if delta f is small okay so you might get something like a cosine picture which is like this but what will happen there there will be a 180 degree phase shift so you it won't continue like this it'll continue in this way okay it'll go off like this and then maybe come down here and then once again there'll be a 180 degree phase shift depending on am I right I'm making a mistake it'll again go up positive no no it'll be minus right it'll come here and then do what oops what happened what is this okay anyway I'm not able to figure out how to erase it okay so it should it should what should go up or come down come down right go up you sure it'll go up okay so because it's coming this way so this should go up again and then maybe I don't know where it'll go maybe it doesn't go all the way up okay so it looks it'll look roughly like this so so it'll look a bit too crazy okay so it's nothing to do with what you expected before okay so of course if delta f is 0 theta 0 then you would have got the nice flat thing so the next stage in checking your receiver is to see what after your after the complex baseband signal does it seem to be what you expected okay if you if you expect a delta f then such crazy shapes will show up okay so it's difficult to make sense of them otherwise if you've never seen it before you'll look at it and say looks like something else is happening this is dipping that is dipping you might come up with all kinds of philosophies but ultimately delta f can cause things like this delta f is really really small also right so it will show up in a strange way stuff to understand okay so hopefully you also see theta is important even if delta f is 0 if theta is close to say pi by 2 then everything is gone so you're not you're not the face of your carrier is also crucially important okay so that's why these detectors are called coherent detectors you have to know the frequency as well as the face it should be matched properly okay so it's not the face is not that serious a problem okay the reason is equalizers can handle the face okay that's why face is not a serious problem but you still it's good to have a matched face okay all right so we'll stop here yes if you look at the imaginary part okay yes due to the theta something else will come from there to the area those things we'll see next thing will be QPS


Now, this is probably my favorite candidate in the Ravens Hole offensive coordinator search so far. Let's just read the report straight from Adam Schefter. He said, chiefs, offensive coordinator, Eric Bieneme has been requested to interview for the Ravens offensive coordinator job per sources. Bieneme also remains under consideration for the coach head coach job that he has interviewed for and the Titans offensive coordinator job amongst other situations. So, I really like this. I seriously do. Reason being because, I mean, this is somebody I put in a request for the Ravens to request to interview, but this is the Ravens actually moving. So many times, whether it comes to players and now with this whole thing, we've heard it about coaches too. We hear, oh, Ravens are interested in such and such. Ravens are interested in that guy. Ravens are interested in him. Ravens are interested in that, but then we see a lack of action behind it or even a lack of closing. But this process, them starting like this and them actually putting in the request, like, hey, we're not just interested in Eric Bieneme like the report that we heard about a week ago. No, we're actually going to request to interview Eric Bieneme. So, this is another step in the right direction in my opinion for these Baltimore Ravens. Now, with Eric Bieneme, it doesn't stop there though. The report that followed that came from Ian Rappaport. He said, the commanders have yet to hire an offensive coordinator. And one reason why? They've requested permission to interview Chiefs Offensive Coordinator Eric Bieneme. And he's emerged as a potential key candidate. Sources say he also was requested by the Jets, the Titans and the Ravens for offensive coordinator jobs. So, Eric Bieneme is a hot commodity. And the game, well, the game today against the Bengals, this, not that it will make or break his chances really with anything, because it is just one game and we already see the resume of success that the Chiefs Offense has had. But the game against the Bengals could just, that could speed up the process and just make people's interest that much higher. So we'll see how that goes. And Bengals like, Bengals like the Ultimate Trolls, man. You gotta give it to them. They are the Ultimate Trolls, even with the mayor jumping in. And it's, oh yeah, I think Patrick Malone's, Joe Barone needs to take a DNA test to see if he's Patrick Malone's father. I said, whoa, whoa. But anyway, so Eric Bieneme, he is very hot out here. Now, while this is probably my favorite request for the Baltimore Raven so far, and it's just a request. It's not an official interview, but it is a start to actually be able to get an interview. I think this is actually the hardest person that it would be, that this person would be the hardest for them to actually land Eric Bieneme. Reason I say that, now one, the Ravens offensive coordinator job, if Lamar Jackson is going to be a Baltimore Raven, who knows, we'll see. Because we don't know yet. I know there's a lot of people who like, feel like that deal is going to get done. There's a lot of people who don't feel like the deal is going to get done. There's a lot of people that hope the deal gets done. There's a lot of people that hope, that doesn't hope the deal gets done. For those people that hope the deal doesn't get done. But anyway, we don't know what's going to happen with Lamar Jackson. So that is something that makes, not just landing Eric Bieneme, but really landing any offensive coordinator, that makes this very difficult because there's so much uncertainty. But even before that, with Eric Bieneme, he's obviously well sought after. But then on top of that too, on top of both of those things, this would be a lateral move. So with this being a lateral move, I think that that makes it that much more difficult to make it happen. Because it wouldn't just be a lateral move with the Ravens. I mean, you heard about the other teams that have been requesting to interview Eric Bieneme, also for offensive coordinator jobs. So with the uncertainty that the Ravens have, but also him being requested by several other teams for the same position, hey, the competition is there. It's there. Now, another thing too, on top of that, what happens if he gets requested for a head coach opportunity? Because yeah, being an offensive coordinator at another team, it could be cool. You could add to your resume and whatnot, but I'm sure he wants to be a head coach. Like if an opportunity comes along for him to actually be a head coach, you could be looking at all the offensive coordinator stuff. Oh yeah, yeah, that's cool. Yeah, that's nice.  Oh yeah, let me get on that. Let me talk to them. Let me see what they talking about. So that's something else that I think could be in the Baltimore Ravens way when it came to the possibility of bringing on one Eric Biennamy. Now, another thing, I always hear people say, they always say, oh, Eric Biennamy, he doesn't even call the plays, and Andy Reed calls the plays. Eric Biennamy doesn't even call the plays. So, and I see people try to make that like a bad thing for Eric Biennamy. When a QB coach gets hired to be offered, does a QB coach call plays? Unless I said something I don't know, but does a QB coach call plays? But there have been plenty of QB coaches that are requested to become offensive coordinators. But does a QB coach call plays? I don't think so. We always see them get requested to be offensive coordinator, but Eric Biennamy is an actual offensive coordinator. So he coordinates the offense. So I'm sure he knows the plays. He can call the plays. I'm sure he's even called plays before. He may even call some plays now.  It's like, come on now, like really. And I see that conversation among so many people. And I just like, that's not a reason for me to be like, oh, wait, no, okay, he doesn't, no. This would be the one that I would want the Ravens to hire. And again, it's, I feel like the chances are slim. Obviously not impossible, but they are slim. But it just depends on so many, so many factors. Now, well, one good thing about Eric Biennamy, if he is, if the Ravens could add him, I think it would be, and again, so much obviously depends on what happens with Lamar Jackson. Like so much depends on what happens with him, man. Like really every, the way that the Ravens move, moving forward, like this off season, everything depends on Lamar, everything does. Everything depends on Lamar Jackson. What's gonna happen with him? It's like, it's so crazy, man, thinking about it, man.  That could have been on Lamar Jackson. How are you gonna move in the draft? That could depend on Lamar Jackson. How are you gonna move in free agency? That could depend on Lamar Jackson. Everything depends on what they're gonna do. Because, well, obviously, y'all know, he ain't got to explain it to y'all. But with Eric Biennamy, with him, and I mean with a lot of other guys as well, but with him especially, because it's been a year, and I don't know what it is. I don't know what it is, but it's been years where Eric Biennamy, every off season, his name comes up, or it's a possibility that he goes there, it's a possibility that he goes there, it's a possibility that he goes there. I remember last year, last year, his contract ran out with the Kansas City Chiefs, and I was like, oh, whoa, whoa, whoa, whoa, hold on now, there, buddy! But obviously, they had other plans. Now those other plans that they had didn't quite work themselves out, but there he is, it's all good, it's over with now. But every year, his name, it pops up.  His name keeps popping up, but nothing has happened yet. Nothing has happened yet. Now, I don't know if it's been one of those cases where the team's just been like, no, Eric Biennamy, no thanks, but then you would have to think like, man, we've seen other offenses that have not been as good as a Chiefs offense, and we've seen them, and teams have hired other offensive guys that have less on their resume than one Eric Biennamy. So it will be weird. Or on the flip side too, maybe Eric Biennamy, it was one of those Eric DeCosta type of things. Well, maybe and not even necessarily him taking over as a head coach from Andy Reed. So maybe I shouldn't have said Eric DeCosta, but what I meant when I said that is that he could just be waiting for the right opportunity. Eric DeCosta was different because he already had the opportunity and he was just turning down whatever. He was going to interviews and stuff or whatever, but they had their plan with him taking over as a Ravens GM. They had that plan in place for a while, but with Eric Biennamy, he could be turning down these opportunities or possible opportunities because he's just waiting on the right one. And because you don't wanna just jump ship, just to jump ship. You don't wanna say, oh, I'm taking that job just to take that job, just to get away from the Chiefs. And I learned that, I learned that at my last job before we started doing this for a time. I learned that because before I would, before I had gotten my last promotion, the position that I was in, I hated it. I did not like it at all. And I would be applying to this job. I'll be applying to this department, that department, that department, that department, that department. So I would have, sometimes I would have interviews. Sometimes I wouldn't get an interview for these different departments. And I will never forget, there was one recruiter because the company that I worked for, they had a recruiting department. And it was their job to help find jobs for people within the company. So there's one recruiter. I appreciated her so much for this because I would have never known. She was like, she took the time to speak with me, get to know me, find out what was going on. And they can see everything. They can see everything. They can see all the jobs that you applied for from within, they can see all of that stuff. So she was like, man, you've really been applying for a lot of jobs. You've really been applying for a lot of different departments. She said, when, I was about to say when teams see that, when other teams, but when departments, when other departments see that, they're hiring managers and whatnot. When they see that you've been applying to so many different departments, it makes it look like, it doesn't even make it look like you want to work for their department, but it makes it more so look like you just want to get out of there. And I was like, oh man, well that's true, but I don't want it to look like that because she told me that that lessens their chances of even not even just hiring you, but even bringing you in for an interview in the first place. And I was like, oh, well that is something right there. Never thought of it like that. So she was like, you can continue to obviously apply to other departments or what, but slow it down. Take it down a notch. Because again, it's not a good look. If you just sending out your resume here, here, here, here, here, here, because it almost looks desperate, even though I was kind of desperate to get out. But with Eric B. Enemy, it could be with him, like he may not be so desperate to get out. And he may not, he may be like, you know what? The grass ain't necessarily gonna be greener if I go over here. Oh yeah, I see that organization over there and they ain't, nah, I ain't feeling them. I don't like the way they do business. Oh, I see that history. No, that's not a good fit for me. So he can take his time. Obviously he can take his time because he's still with KC. He's still with them. So this is wherever he chooses, man, I'm pretty sure it's gonna be a well thought out process. Now, if that just happens to be with the Baltimore Ravens, they're obviously well respected around the league, but I think if he could come to the Baltimore Ravens and really, and again, so much depends on Lamar Jackson. A lot depends on Lamar Jackson. I wonder, think about this too. For whoever the Ravens end up hiring as their next offensive coordinator, I wonder if, nah, I don't think they would, but I don't know, man. Again, everything depends on Lamar Jackson. I wonder if whoever they hire for their next offensive coordinator, if they would take a one year deal, or if they would want a one year deal. If they would be like, you know what, I don't wanna be stuck here, man. I don't know what's happening with y'all quarterback. And I don't wanna come into a situation and then everything, the whole script gets flipped on me. So anyway, but with every enemy, if he was to become an offensive coordinator for the Ravens and if Lamar Jackson stayed, or if Lamar Jackson didn't stay, and he still ran a successful offense, it'd be tough. But that could go good on his resume and possibly even provide him with another opportunity to be a head coach. Because he could go to, he could have been offensive coordinator to franchises and had success.  And if they can, especially if they can get that passing game, right? The running game gonna be fine. But if they can get that passing game right, ooh. That would just look so great on their resume. Like this Baltimore Ravens team who always like top five, excuse me, in Russian, but they be at the bottom in passing. Or that passing just needs significant improvement. That passing game needs significant improvement. If they come out here and they get like 2,000 y'all receivers, not receiving tight ends, but receivers. And obviously still get Mark Andrews involved a lot that running game doing this thing. The offense is just, they moving. They scoring in the red zone, their red zone efficiency goes up. Just everything improves. Their situational play calling gets much better. That could just look so good on an offensive coordinator's resume, especially for the Ravens offense, because it's obviously been pointed out just how lackluster it's been. But with Airbnb specifically, maybe this could catapult him to a head coaching job possibly. And obviously it would all depend on what opportunities are out there. You don't wanna just jump at the first thing, but still. So anyway, I love y'all, team keeping clean. You know what? I really appreciate y'all for just everyday just listening to our thoughts on whatever's going on with this team. I appreciate it, cause y'all don't have to but y'all do, so I appreciate you supporting. Thank you. Enjoy the AFC and NFC championships. Gonna be some great games. Some really great games. I seen some people say, oh, well, since my team's not in it, that seems Ravens fans say it too.  I'm like, I am, I don't know what you're gonna watch. That's fine, but I'm watching.  The Ravens ain't in it too. They ain't turning on the TV. They ain't turning on football. No, I'm watching and I'm going to enjoy. So I hope y'all enjoy the games too. I know a lot of Ravens fans gonna be rooting for the Chiefs Heavy.  I mean, Ravens ain't in the Super Bowl obviously. So that's already a loss. But then it's like, man, Chiefs will be back again. And this, if Chiefs win, that would be their third Super Bowl, right? Cause they beat the 49ers. They lost to the Bucks. And if they get there, now that'd be their third Super Bowl in what? Five, six years? Something like that. And then if the Bengals win, like, whoo, two Super Bowls in a, oh my God. But even the fact that they're in this position, they've passed the Ravens. I don't know Ravens fans don't like it. The Bengals have passed the Ravens. They've passed them. They are in the position. Two years straight. Two years straight to be playing in the Super Bowl. Two years straight. But anyway, so it's like, it's a little loop up for Bengals. Like they got bragging rights right now over the Ravens. They got it. They got, we can talk about injuries. Oh, what if and that, two years straight. Two years straight. So that's that. Anyway, I love y'all. I appreciate y'all and we out.


In this course, I'm going to show you how to use Twitter for business. I'll explain how it's different from other social networks, and how you can use it to achieve measurable results. Hi, my name is Eric Schwartzman, and I'm the best-selling co-author of Social Marketing to the Business Customer. And over the past nine years, I've led social media trainings at Boeing, City National Bank, Johnson & Johnson, and dozens of small to medium-sized organizations as well. You don't have to be a techie to take this course. If you can surf the web, point, click, drag and drop, this workshop is for you.  But because most Twitter members don't use the privacy features, like Facebook members do, Twitter is an easier, quicker way for businesses to engage prospective customers than Facebook, since everyone can see what everyone else is saying without having to be friends first. Twitter is also the fastest social media network. More than 55% of all tweets are made from mobile devices, resulting in a large number of impulsive responses to negative consumer experiences. Left unchecked, negative tweets about products and services that fail to deliver upon customer expectations have the potential to permanently stain your reputation. You can pause, rewind and replay the screencast demos in this course as many times as you'd like and learn at your own pace. 34% of marketers have generated new business leads on Twitter. I'll even show you how to tweet photos from Instagram and check-ins from Foursquare. So what are you waiting for? Get this action class right now and start connecting with prospective customers on Twitter today.