I recently was contacted by someone with questions regarding a document I wrote (LTE PHY fundamentals) a few years ago as part of a class at Columbia University and that is hosted on my website. The confusion was regarding Doppler shift and the time separation of the reference signals in LTE.

Quoting the message:

I was trying to tell you that 500 km/h does not mean a Doppler shift that you wrote in your document. If the carrier frequency is low and the receiver is moving through the transmitter Doppler shift will be zero cos(90).

Please read the LTE documentation carefully: Universal Mobile Telecommunications System (UMTS); LTE; Requirements for Evolved UTRA (E-UTRA) and Evolved UTRAN (E-UTRAN). In chapter 7.3, it is clearly written that this speed can be from 15 to 120 in the best case with a Doppler shift, not 500 as you wrote and even calculated the Doppler shift.

After responding to the question, I thought that it would be a good idea to write a quick post here and reference it from my website to clarify this topic if other people had the same questions.

The 3GPP standards do account mobility of up to 500km/h. Checking ETSI TR 125 913 V9.0.0 (Universal Mobile Telecommunications System (UMTS); LTE; Requirements for Evolved UTRA (E-UTRA) and Evolved UTRAN) one can read:

The E-UTRAN shall support mobility across the cellular network and should be optimized for low mobile speed from 0 to 15 km/h. Higher mobile speed between 15 and 120 km/h should be supported with high performance. Mobility across the cellular network shall be maintained at speeds from 120 km/h to 350 km/h (or even up to 500 km/h depending on the frequency band). Voice and other real-time services supported in the CS domain in R6 shall be supported by EUTRAN via the PS domain with at least equal quality as supported by UTRAN (e.g. in terms of guaranteed bit rate) over the whole of the speed range. The impact of intra E-UTRA handovers on quality (e.g. interruption time) shall be less than or equal to that provided by CS domain handovers in GERAN.

The mobile speed above 250 km/h represents special case, such as high speed train environment. In such case a special scenario applies for issues such as mobility solutions and channel models. For the physical layer parametrization EUTRAN should be able to maintain the connection up to 350 km/h, or even up to 500 km/h depending on the frequency band.

Regarding this topic, Samsung did some very interesting experiments on the high speed case inside a plane flying at 750km/h. Also, a recent paper was presented in a Sigcomm workshop that I was part of the TPC committee. It presented high speed measurements of LTE (check the paper titled “Performance of LTE in a High-velocity Environment: A Measurement Study”).

As for the Doppler shift, the Doppler equation does contain a cos(alfa), but alfa will only be 90 degrees when a mobile is under the cell tower, In general, in mobile communications, one does not consider the special case of alfa=0 (see below for more details). Anyhow, the way system specifications are designed is for the worst case scenario. In the case of LTE, the maximum possible doppler shift is for the highest carrier frequency (~2GHz at the time I wrote the document), V=500km/h and alfa=0 (cos(0)=1). That’s why the separation of the pilot tones in the LTE/OFDMA lattice is 0.5ms (the derivation of the value 0.5ms is in my document). Essentially, the Doppler shift defines the coherence time, which is the duration of time for which the channel does not change “substantially” or, more mathematically defined, the delay for which its autocorrelation is “higher” than a certain value (there is different ways to define coherence time depending on how “strict” one wants to be). Pilot tones or reference signals are used to sample the channel to perform equalization and other tricks. The Doppler shift defines the maximum sampling period that will allow to sample the channel correctly. If the channel can change as fast as every 0.5ms, one needs to have one sample at least ever 0.5ms. Therefore, the reference signals are separated every 0.5ms, tackling this way the worst case scenario for the coherence time.

Generally, in wireless communications for terrestrial applications, one usually does not even consider alfa because the heights of the towers (10 to 50m or so) are much smaller than the distances between the mobile devices and the towers (up to 35km for the biggest supported cells), so the value of alfa is always very small. However, in radar applications they do consider alfa because planes are flying at high altitudes.

Anyways, the best way to read about this concepts and have them explained much better than what I did here, is to check Rappaport’s book.

ReferenceSignal

I am quite busy lately and neglecting my blog too much, it is time to catch up a bit. Although work is one of the main things keeping me busy, going back to playing soccer regularly, running quite often and a few other things are keeping me busy… plus it is summer and in summer I rather spend my free time away from my computer.

Anyhow, to catch up, just a few thoughts on a few things.

I have been gathering some old stuff from when I was an undergrad. I will try to post more source code and other projects on my personal website soon.

Happy summer everyone! And for those of you in the southern hemisphere, happy winter! Oh, and could you please share a video of the toilette flushing and spinning the other way?

First of all, the reason why I have been missing in action for a couple of months on my blog has been that I have been rather busy (but “good” busy) with work. Lots of exciting things happened recently, including reaching two of my main milestones for this year. I am still busy, but I will try to be back here every now and then to share stuff that I find interesting.

Having said that, if you know me well, you know that these days I am doing crazy schedules and working many hours so I can also watch as many World Cup games as possible. I will not reach my great achievements from the World Cups of 2010 and 2006, when I saw every single game of each tournament (yes, you read it right, every single one), but I am doing a decent job. By the way, if you happen to have a lot of free time (I had just finished my undergrad in 2006 and I was on a lazy + learning German + travel hiatus, and I was a grad student in 2010), I challenge you to watch every single game of a World Cup. It’s an amazing experience. But not easy. As an example, I saw the Portugal-France semifinal in a ferry with poor satellite reception going from Athens to Paros. And I saw the final in some random restaurant in the less populated side of Siros.

Anyhow, I just wanted to share some thoughts about the World Cup so far:

  • Spain: I knew we were in a bad shape and there was 0 chances we would mean. But still, what Spain did was lame. The way they surrendered after the Netherlands’ second goal was very sad. I guess Spain always sucks in World Cups and now we just had the last 6 years as an exception. The exception that confirms the rule. I was back home in Barcelona for the games against the Netherlands and Chile, so it hurt even more.
  • USA: I like this team a lot, and I am not saying it because the US is my second (actually, now officially permanent) home. I like how they play, very talented young players. And I really like this Dempsey guy. Back in my grad student years, me and my Spanish friends we always played in the intramurals against the US kids. Playing futsal 5on5 we always kicked ass… but when it was 11on11, those guys had so much stamina and energy that we always lost! And I see that in the World Cup too. It’s very interesing how over the last few World Cups the US has scored a large number of goals towards the end of the game, when the rival is tired (a game every 3 days ain’t easy!). Having said that, sometimes one sees that the US does not have that much experience in soccer. For example, no team has used a “polo-type neck” for the jersey since the early 90s. They need a jersey redesign asap! Also, they did not win against Portugal for 2 reasons: 1) that guy whose dad is the former national couch had a terrible game and made an awesome pass to CR96 Ronaldo, and 2) the US has to master the ancient skill of wasting time.
  • Argentina: Playing bad, but with a stellar Messi. I hope they win the World Cup just so there are no more counter arguments (i.e. he never won a World Cup, unlike Maradona and Pele). The world needs to finally agree that Messi is, BY FAR, the greatest player of all times.
  • Germany: My favorite team (aside from Spain) for the last few World Cups. Playing very good. Although I really want Messi to win a World Cup, I hope for a Germany-Brazil final.
  • Ghana: Such a good team. The way they play is just amazing, and although I always cheer for Germany, I was quite annoyed when Klose scored the 2-2. However, kudos for Klose, top scorer of a World Cup tied with Ronaldo (the good one).

I want to write more, but I’ll leave it here for now. Back to work now! I have been here since 7 today. It will be a long day. But it’s all good, fun stuff at work. Projects going great. And, in parallel, a really fun World Cup. What else can one wish for?

640px-WC-2014-Brasil.svg

I was reading last night about Blackphone, one of the most interesting things presented at the recent Mobile World Congress in Barcelona. This new handset is being developed by a Spanish startup (Geeksphone) in partnership with the US-based security firm Silent Circle. The whole system appears to be based on a security-enhanced version of Android known as PrivatOS.

This phone is clearly a very interesting idea and a product to consider, specially because it is the first time someone does an actual step towards ensuring privacy of communications for smartphone users. However, I would like to have more details on how everything work. Blackphone claims that it can do encrypted voice calls, but something tells me that this is probably only possible among Blackphones and you cannot have an encrypted call with a “normal” phone. Moreover, this is not something new, as there are apps out there that allow to do the same things on, for example, an Android phone. The only privacy concern with those is whether the server running the app in the background gets to “see” the messages or not. And the same question applies to the Blackphone. I am assuming that, if the crypto is well done, everything stays within the phones involved in the “secret call”. But, again, having more tech details would be helpful.

On top of secured calls and messages, which can already be done with several well known apps (for example RedPhone), Blackphone has other interesting features, such as a fine-grained control of the permissions each app gets. On top of that, Blackphone does very simple things automatically, such as configuring WiFi in a way that it is not trying to connect to any hotspots it senses (avoiding potential Man-in-the-Middle attacks). It also seems to offer a way to remotely wipe the device without requiring a centralized service (like the Find My Phone feature from iCloud). I wonder how they do this, though, and how they address the wipe command from an arbitrary place in the Internet (i.e. my home computer) to the Blackphone without a server somewhere in between that keeps an open connection with the phone.

All in all, a very interesting phone, yours for 629$.

blackphone

Lately I am trying to post here every time I find out something useful that I did not really know how to do. This is something I had to Google yesterday and is very useful. In my case, the problem arises when using OPNET. If you are an OPNET user, you know that results can either be visualized with the OPNET tool (very useful for rapid visualization and check of results, but not good to make nice plots) or export the results to an Excel spreadsheet.

Sometimes you have a plot with literally tens of thousands of data points and you would like to down-sample it. OPNET has an option in the results panel that allegedly down-samples the plot, but it takes forever and ever to run and the outcome is never what I need. So what I do is the following. Say that you have your data in two columns:

img1

We are going to add a third column with the following operation: “MOD(ROW(A1),N)”. Change N by the down-sampling you want. For example, if N=20, we will be eventually using 1 data point from every 20.

img2

Now we copy [D,1] on the entire column D. This will result in column D being populated as follows: 1, 2, …, N-1, 1, 2, …, N-1, 1, 2, …

img3

Now we select column D clicking on top of it and we go to “Data – Filter”. A little arrow appears on top of the column. Clicking on it we can filter the values of the spreadsheet based on column D. Select only the value “1” and click OK. I usually do it selecting “1” so I always keep my very first sample. The result is a “new” spreadsheet (note that the actual spreadsheet did not change and all the data is still saved in the file, only what is visualized changes) with only one data point out of every N. You can go ahead and plot it normally as you always do with Excel.

img4

I am sure there are ways to do this easier and more efficiently. If you know any, please write a comment and let me know.

Street Dogs Savin Hill album was playing while I wrote this. Great music to start the day.

Through one of my colleagues I learned yesterday about the infamous iOS SSL bug that resulted in iOS devices accepting any certificates whether they were correct or incorrect. This could allow an attacker or man in the middle to eavesdrop or intercept traffic theoretically secured through, for example, https.

I am not going to write today about what the bug does and the potential impact. I will, however, highlight the fact that this bug seems to have gone unnoticed since iOS 6 in 2012, which is quite scary. If you are interested in the bug and more details on the media burst it has created, you can read about it here, here or here.

I want to focus specifically on what the bug was. This bug that has terrifying consequences is just a basic and simple human mistake, probably originated at a classic copy-paste of code. Let’s look at the code, which I found here and is, in turn, from the Apple’s published open source code (which, obviously, is already fixed).

static OSStatus
SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams,uint8_t *signature, UInt16 signatureLen)
{
    OSStatus        err;
    ...

    if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
        goto fail;

    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
        goto fail;
        goto fail;

    if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
        goto fail;
    ...

fail:
    SSLFreeBuffer(&signedHashes);
    SSLFreeBuffer(&hashCtx);
    return err;
}

Essentially, after the second check, the line of code that goes to fail is repeated. Therefore, the third and last check for the hash is never executed and this subroutine always goes to fail. As you can see, this is not the fanciest bug ever. On the contrary, it is most likely a classic copy-paste human error.

I have always been very particular when coding in C and Java and I ALWAYS use {} for condition statements. So, although this

if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
    goto fail;

is exactly the same as this

if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0){
    goto fail;
}

using the latter would have avoided this bug. So, long story short, the conclusion is: always use {}. And a related corollary, vi and vim for Unix are cool and you look very cool and smart using them, but always use an IDE when coding. They are very smart and helpful. An IDE would have highlighted in bright annoying yellow the third hash check and labeled it as “dead code“. If you are a Unix user, I recommend Eclipse.

It took me a while to figure this out. I have an app that I coded and it runs a service in the background. Given a specific event, I want to show an alert on the screen. How to do it?

All the ways I tried would work nicely, but the alert would only pop up when I opened the activity that started the service in the background. My goal was to have a “global alert” that will show up on the screen right then and there, no matter what the user is doing or what activity is controlling the screen. And, if the screen is locked, the alert should be displayed as soon as the user unlocks the phone.

Here is how you do it:

  • First create a new class (activity). We will call it displayAlert:
public class displayAlert extends Activity {

    private boolean doDisplayAlert;

    private static final boolean D = true;
    private static final String TAG = "tagYouUseForYourApp";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(D) Log.i(TAG, "+++ ALERT starting alert class. +++");
        if(D) Log.i(TAG, "+++ ALERT getting Intent. +++");

        //Get intent and boolean "proceed" field within.
        Bundle bundle = getIntent().getExtras();
        displayAlert = bundle.getBoolean("proceed");

        if(D) Log.i(TAG, "+++ ALERT got Intent. +++");

        if(displayAlert == true){

             if(D) Log.i(TAG, "+++ ALERT do display alert. +++");

             // custom dialog
             AlertDialog.Builder dialog = new AlertDialog.Builder(this);
             dialog.setTitle("Write here whatever you want to display in the alert message as title.");
             dialog.setMessage("Text content of the alert message.");

             dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int whichButton) {
                      //Do something when the user clicks OK to close the alert (optional)

                      finish();
                 }
             });

             dialog.setNegativeButton("Ignore", new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int which) {
                     //Do something if the user chooses to ignore the alert (optional)
                     finish();
                 }
             });

             dialog.show();

        }else{

             if(D) Log.i(TAG, "+++ ALERT do not display alert. +++");

             //Do something in the case the service does not want you to display an alert.
             //Actually, you can use this code to display two types of alert depending on the
             //value of the boolean that the service passes to this class ("proceed")
        }

    }

}
  • Now, in the code of your service you will have something running. If you want to display the alert, you use the following code:
if(D) Log.i(TAG, "+++ SERVICE starting displayAlert activity to show an alert. +++");
Intent showAlert = new Intent(applicationContext,displayAlert.class);
showAlert.putExtra("proceed", true);
showAlert.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
applicationContext.startActivity(showAlert);
if(D) Log.i(TAG, "+++ SERVICE displayAlert activity went well. +++");
  • Note that this code needs the context of the parent application (applicationContext). What I do is to pass the context when I create and start the service.
  • Remember to define the class in the manifest file (add this code within the <application>. There should be first your main activity, then the service and then you can add the displayAlert activity)
         <activity
android:name="com.test.nameofyourapp.displayAlert"
android:label="@string/AlertActivityName" >
</activity>
  • That’s it!

I hope this is useful.

Pennywise is on shuffle on Spotify at the moment. Have a good one!



Google just published another very interesting analysis and visualization of one of its data sets. In this case, they have processed data from their Google Play store. Based on the number of downloads and popularity, they have visualized on a time axis the “relevance” and “popularity” of each music genre as time progressed, putting together what they call Google’s Music Timeline.

I really love this kind of projects at Google. At first sight, you might think it is useless. But I think it is extremely interesting and very useful. Moreover, I love it allows you to “zoom in” to see the timeline of the sub-genres within a given genre. For example, I gave it a try with Metal. The result shows many interesting trends… including the raise and fall of Hair Metal. The good old times of good rock!

google_music

The analysis also shows examples of the most relevant albums of each music style as time progressed. Here is were I realized that this analysis is based on a quite incomplete data base. For example, I saw no mention of any Metallica album. Not even when zooming into Metal. There are no AC/DC albums to be found either.

All in all, very interesting given the data set it has been derived from. And definitively a yummy candy for us music lovers!

Edit:

There are AC/DC albums! But the system does not consider them among the most influential ones. Things would have been differently if I had worked on that project! 🙂

By the way, another very interesting application is to search for one of your favorite bands and see how their popularity grew or decrease or fluctuated. I am attaching the example with one of the greatest punk rock bands ever (NOFX) (how is it possible they are declining?!?!) and probably the best electronic music band ever that was not rightfully recognized until they released a poppy album last year (Daft Punk) (yes, that catchy song by Kanye West had a catchy part that was actually by Daft Punk and many did not know until last year).

nofx

daftpunk

Check this IEEE ComSoc tutorial on Advances in Coordinated Multi-Cell Multi-User MIMO Systems. Free of charge for a limited time.

Advances in Coordinated Multi-Cell Multi-User MIMO Systems

 

I read this morning some very interesting news about Twister, a new decentralized and anonymous Twitter-like social network. It was created by Miguel Freitas, an engineer based in Rio De Janeiro, this new micro-blogging application can’t be shut down by, for example, some nation state or large corporation. Also, Twister is designed in such a way that other users cannot know whether you are online, what your IP address is, or who you follow.

As a bitcoin “aficionado”, I find particularly interesting that the magic behind Twister is this popular alternative currency. It is another great example of the great range of potential applications that bitcoins unfold.

You can read more about this story at Wired Magazine:

Twister is surprisingly easy to use for an application that’s so new, that isn’t controlled by a central authority, and that places so much emphasis on security. Other decentralized alternatives to Twitter and Facebook — such as Pump.io, Identica and Diaspora — require that you either operate your own dedicated server or trust someone else to run a server for you. Twister works more like peer-to-peer file sharing software: Launch the app, and it connects with other users. There’s no need for a central server.

It manages this trick through the bitcoin protocol, though not the network that actually drives the digital currency. Basically, the protocol handles user registration and logins. Just as machines — called miners — verify transactions over the bitcoin network to ensure no one double-spends bitcoins and everyone spends only their own coins, a network of Twister computers verifies that user names aren’t registered twice, and that posts attached to a particular user name are really coming from that user.

Posts are handled through the BitTorrent protocol. This lets the system distribute a large number of posts through the network quickly and efficiently, and it lets users receive near-instant notifications about new posts and messages — all without the need for central servers.

About me:

Born in Barcelona, moved to Los Angeles at age 24, ended in NYC, where I enjoy life, tweet about music and work as a geek in security for wireless networks.
All the opinions expressed in this blog are my own and are not related to my employer.
About me: http://rogerpiquerasjover.net/

Blog Stats

  • 124,284 hits

Twitter feed

Error: Twitter did not respond. Please wait a few minutes and refresh this page.

Enter your email address to follow this blog and receive notifications of new posts by email.