Here are a few things that aren't right:
1) Regardless of the Carrier Synchronization:
You are using 0 and 90 degrees for your signaling. You would need an I and Q channel in order to decode the signal if that were the case. For BPSK (Binary) you should be using 0 and 180 degrees. Only if you are using QPSK should you use 90 and 270 degrees, then again its just mimicking using an I and Q channels.
There is a system block diagram below that will make this more apparent.
2) DPSK does not require any phase carrier synchronization. You pay for it by halving your SNR.
(for BPSK, eliminate Q and sqrt(2)
I-inphase channel Bit values
Q-quadrature bit values
C = (I + J*Q)/sqrt(2); // recombined I and Q channels
for n = 0 to length( C )
x_diff = x_diff(n-1) *C(n); //where X(n) <0 == 0
//X_diff is the differentially encoded channels
I - retrieved I channel
Q - retrieved Q channel
C =I + j*Q;
for n = 0 to length( C )
decoded(n) =C(n)/decoded(n-1); //where X(n) <0 == 0
4) You should never see a phase value because of thresholding at the sampler block
Transmitter Block Diagram
Receiver Block Diagram
(Remember you can ignore anything with the Q channel path if you are using BPSK, ignore the Convolutional encoding block and the input string block this whole thing will be easier to understand) .
The Sampler block acts like a Analog to Digital Converter. It samples the output of the I and Q channels at the bitrate your transmitting at (100bits/s, 200bits/s etc) it will give you the AMPLITUDE of the signal recovered.
Because, hopefully, you've used NRZ encoding, (-1, +1) to signal 0 and 1, you must threshold your signal. All values below Zero are 0's and all values above zero are 1's. If you've used RZ encoding that is (0, 1) instead of (-1, +1) for your signaling you should threshold at 0.5.
Therefore you should NEVER work with a phase value.
5) Additional Block Diagram Information:
This is purely to be thorough and give readers a better idea about what is going on.
1) The Users inputs a string ("Hello World" for example) this gets converted into its
Ascii binary value.
3)This then gets put through a convolutional encoder, this is for feedfoward error
correction. This is to reduce the transmission errors due to noise in the
communication channel. Like power-lines or someone talking.
4)The binary values are converted into Non-return to Zero Encoding (NRZ) this means
that 0's are converted to -1's and 1's are converted to +1's.
5) differential encoding is applied to eliminate the need for carrier (discussed above)
6)The Signal is split into the I and Q channels (all even bits go to Q. All odd bits
go to the I channel)
7) They are then shaped into pulses by the wave generator.
8) An Inter-Symbol Interference filter is applied (root raised cosine filter).
9)The I and Q channels are multipled by cosine and sine (same frequency, just shifted
90 degrees) then recombined and transmitted.
10)The Receiver process is the same thing as the transmitter in reverse except:
Convolutional Decoder: Use the Viterbi algorithm.
Detector Block - this is where the NRZ thresholding takes place, values greater
than Zero are 1's values less than Zero are 0's
6) Working with M-ary (like Bin-ary, or trin-ary)
If you want to work with more data points in QPSK, you need to generate your constellation diagram.
Remember that all points on a QPSK system should lie on a circle.
Think of each point as a combination of the I and Q channels and not as purely a Phase value used for signaling.